使用接口和类的多态性

时间:2011-03-21 10:52:21

标签: java polymorphism

下面编码的多态性有什么不同吗?基本上是方法调用的绑定存在差异吗?

多态性类型1:

class A
{
    public void method()
    {
        // do stuff
    }
}

class B extends A
{
    public void method()
    {
        // do other stuff
    }
}

现在我使用A

做B的事
A a =  new B();
a.method();

多态性类型2:

public interface Command
{
    public void execute();
}

public class ReadCommand implements Command
{
    public void execute()
    {
        //do reading stuff
    }
}

public class WriteCommand implements Command
{
    public void execute()
    {
        //do writing stuff
    }
}

public class CommandFactory
{
    public static Command getCommand(String s)
    {
        if(s.equals("Read"))
        {
            return new ReadCommand();
        }
        if(s.equals("Write"))
        {
            return new WriteCommand();
        }

        return null;
    }
}

现在我使用命令工厂:

Command c = CommandFactory.getCommand("Read");
c.execute();

我的问题是:上述两种多态性是否存在差异。我知道这两个都是运行时多态性的例子,但是[关于方法的绑定]或者其他任何不同之处是否存在差异?

4 个答案:

答案 0 :(得分:2)

我想

之间存在一个区别
Command c = CommandFactory.getCommand("Read");

A a =  new B();

...在第一种情况下,你有无选项但是要使用界面(或只是Object),因为赋值运算符右侧的表达式是类型Command

在第二种情况下,您故意选择将结果分配给A类型的变量,即使您可以已经写过 p>

B b = new B();

这实际上只是设计选择的一个区别 - 它不会影响对c.execute()a.execute()的调用实际行为的方式。

答案 1 :(得分:1)

您的Polymorphism Type 1Polymorphism Type 2具有相同的多态性:)

答案 2 :(得分:0)

对于运行时行为,没有区别。但是

区别在于编译。即

在1st Type中,当您使用直接类引用时,您需要在编译时出现这两个类。

但是对于第二种类型,只在运行时才需要这些类。

答案 3 :(得分:0)

绑定(运行时)没有区别。类型1紧密耦合,而类型2松散耦合,在编译方面有所不同。