使用接口和类的多态性

问题描述 投票:0回答:5

下面编码的多态性有什么区别吗?方法调用的绑定基本上有区别吗?

多态类型 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();

我的问题是:以上两种多态性有什么区别吗?我知道两者都是运行时多态性的例子,但是有什么区别[关于方法的绑定],或者与此有关的任何其他区别吗?

java polymorphism
5个回答
2
投票

我想两者之间有一个区别

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

A a =  new B();

...在第一种情况下,您 别无选择,只能使用接口(或只是

Object
),因为赋值运算符右侧的表达式是
Command
.

在第二种情况下,您故意选择将结果分配给

A
类型的变量,即使您可以

B b = new B();

这实际上只是设计选择上的差异 - 它不会影响调用

c.execute()
a.execute()
的实际行为。


1
投票

你的

Polymorphism Type 1
Polymorphism Type 2
是同一个多态:)


0
投票

关于 runtime 行为,没有什么不同。但是

不同之处在于编译。即

在第一种类型中,当您使用直接类引用时,您需要这两个类在编译时都存在。

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


0
投票

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


0
投票

作为用户,对于类型 2,您不需要包含/导入接口的实现。意味着您只需在不知道/包括/导入该实现本身的情况下订购任何实现的实例。

对于类型 1,您需要包含/导入每个实现,以防您必须使用该实现。

© www.soinside.com 2019 - 2024. All rights reserved.