从实现接口的对象调用方法

时间:2013-08-14 19:48:20

标签: java methods interface

我试图围绕界面,我希望他们是我的问题的答案。

我为不同的游戏制作了插件和mod,有时候类有onUpdate或onTick或其他可以覆盖的方法。

如果我使用方法创建一个接口,然后创建其他实现该方法的类,并创建类的实例,那么如何一次从所有对象中调用该方法?

5 个答案:

答案 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;
    }
}

另一方面,Counter2count应该做的事情有不同的看法:

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)。您可以迭代它们并调用方法countCounter1将返回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的实现,实例化它,将它添加到列表中并调用接口指定的方法。