下面编码的多态性有什么区别吗?方法调用的绑定基本上有区别吗?
多态类型 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();
我的问题是:以上两种多态性有什么区别吗?我知道两者都是运行时多态性的例子,但是有什么区别[关于方法的绑定],或者与此有关的任何其他区别吗?
我想两者之间有一个区别
Command c = CommandFactory.getCommand("Read");
和
A a = new B();
...在第一种情况下,您 别无选择,只能使用接口(或只是
Object
),因为赋值运算符右侧的表达式是 Command
.
在第二种情况下,您故意选择将结果分配给
A
类型的变量,即使您可以写
B b = new B();
这实际上只是设计选择上的差异 - 它不会影响调用
c.execute()
或 a.execute()
的实际行为。
你的
Polymorphism Type 1
和Polymorphism Type 2
是同一个多态:)
关于 runtime 行为,没有什么不同。但是
不同之处在于编译。即
在第一种类型中,当您使用直接类引用时,您需要这两个类在编译时都存在。
但是对于第二种类型,类只在运行时才需要。
绑定(运行时)没有区别。类型 1 是紧耦合的,而类型 2 是松耦合的,在编译时有所不同。
作为用户,对于类型 2,您不需要包含/导入接口的实现。意味着您只需在不知道/包括/导入该实现本身的情况下订购任何实现的实例。
对于类型 1,您需要包含/导入每个实现,以防您必须使用该实现。