我试图围绕界面,我希望他们是我的问题的答案。
我为不同的游戏制作了插件和mod,有时候类有onUpdate或onTick或其他可以覆盖的方法。
如果我使用方法创建一个接口,然后创建其他实现该方法的类,并创建类的实例,那么如何一次从所有对象中调用该方法?
答案 0 :(得分:3)
你会看到观察者模式或类似的东西。它的要点是:在某处您必须保留“您的界面”类型的列表(ArrayList
就足够了)。每次创建新对象时,都将其添加到此列表中。然后,您可以在列表上执行循环,并在其中的每个对象上调用该方法。
我稍后会用代码示例进行编辑。
public interface IMyInterface {
void DoSomething();
}
public class MyClass : IMyInterface {
public void DoSomething() {
Console.WriteLine("I'm inside MyClass");
}
}
public class AnotherClass : IMyInterface {
public void DoSomething() {
Console.WriteLine("I'm inside AnotherClass");
}
}
public class StartUp {
private ICollection<IMyInterface> _interfaces = new Collection<IMyInterface>();
private static void Main(string[] args) {
new StartUp();
}
public StartUp() {
AddToWatchlist(new AnotherClass());
AddToWatchlist(new MyClass());
AddToWatchlist(new MyClass());
AddToWatchlist(new AnotherClass());
Notify();
Console.ReadKey();
}
private void AddToWatchlist(IMyInterface obj) {
_interfaces.Add(obj);
}
private void Notify() {
foreach (var myInterface in _interfaces) {
myInterface.DoSomething();
}
}
}
输出:
I'm inside AnotherClass
I'm inside MyClass
I'm inside MyClass
I'm inside AnotherClass
编辑:我刚刚意识到你把它标记为Java。这是用C#编写的,但除了使用ArrayList
而不是Collection
之外没有其他区别。
答案 1 :(得分:2)
接口定义服务合同。简单来说,它定义了你可以用类做什么。
例如,让我们使用一个名为ICount
的简单接口。它定义了一个count方法,因此实现它的每个类都必须提供一个实现。
public interface ICount {
public int count();
}
任何实现ICount
的类都应该重写该方法并给它一个行为:
public class Counter1 implements ICount {
//Fields, Getters, Setters
@Overide
public int count() {
//I don't wanna count, so I return 4.
return 4;
}
}
另一方面,Counter2
对count
应该做的事情有不同的看法:
public class Counter2 implements ICount {
int counter; //Default initialization to 0
//Fields, Getters, Setters
@Overide
public int count() {
return ++count;
}
}
现在,您有两个实现相同界面的类,那么,您如何平等对待它们?很简单,使用他们共享的第一个公共类/接口:ICount
。
ICount count1 = new Counter1();
ICount count2 = new Counter2();
List<ICount> counterList = new ArrayList<ICount>();
counterList.add(count1);
counterList.add(count2);
或者,如果你想保存一些代码行:
List<ICount> counterList = new ArrayList<ICount>();
counterList.add(new Counter1());
counterList.add(new Counter2());
现在,counterList
包含两个不同类型的对象,但在包含实现该接口的对象的列表中具有相同的共同接口(ICounter
)。您可以迭代它们并调用方法count
。 Counter1
将返回0
,而Counter2
将根据您调用count
的次数返回结果:
for(ICount current : counterList)
System.out.println(current.count());
答案 2 :(得分:0)
您不能从碰巧实现某个接口的所有对象中调用方法。反正你不会想要的。但是,您可以使用多态来通过接口名称引用所有这些对象。例如,使用
interface A { }
class B implements A { }
class C implements A { }
你可以写
A b = new B();
A c = new C();
答案 3 :(得分:0)
接口无法正常工作。它们就像几种类可以使用的某种面具。例如:
public interface Data {
public void doSomething();
}
public class SomeDataStructure implements Data {
public void doSomething()
{
// do something
}
}
public static void main(String[] args) {
Data mydataobject = new SomeDataStructure();
}
这使用了几个类可以使用的Data
'掩码'并具有某些功能,但是您可以使用不同的类来实际实现该功能。
答案 4 :(得分:0)
关键是要有一个列表,每次实例化实现接口的类时都会存储该列表。此列表必须在与接口和实现它的类不同的级别上可用。换句话说,编排或控制的类将具有列表。
接口是将实现留给实现接口的类的契约。类实现接口遵守该合同并实现方法而不是覆盖它们。
将界面设为
public interface Model {
public void onUpdate();
public void onClick();
}
public class plugin implements Model {
@Override
public void onUpdate() {
System.out.println("Pluging updating");
}
@Override
public void onClick() {
System.out.println("Pluging doing click action");
}
}
您的控制器类将是实例化和控制操作的控制器类
public class Controller {
public static void orchestrate(){
List<Model> modelList = new ArrayList<Model>();
Model pluginOne = new plugin();
Model plugTwo = new plugin();
modelList.add(pluginOne);
modelList.add(plugTwo);
for(Model model:modelList){
model.onUpdate();
model.onClick();
}
}
}
你可以有另一个名为pluginTwo的实现,实例化它,将它添加到列表中并调用接口指定的方法。