下面编码的多态性有什么区别吗?基本上方法调用的绑定有区别吗?
多态类型 1:
class A
{
public void method()
{
// do stuff
}
}
class B extends A
{
public void method()
{
// do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
现在我用 A 做 B 的事情
A a = new B();
a.method();
Run Code Online (Sandbox Code Playgroud)
多态类型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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我使用命令工厂:
Command c = CommandFactory.getCommand("Read");
c.execute();
Run Code Online (Sandbox Code Playgroud)
我的问题是:上述两种多态性有什么区别。我知道两者都是运行时多态性的例子,但是 [关于方法的绑定] 有什么区别,或者有什么其他区别吗?
我想两者之间有一个区别
Command c = CommandFactory.getCommand("Read");
Run Code Online (Sandbox Code Playgroud)
和
A a = new B();
Run Code Online (Sandbox Code Playgroud)
...在第一种情况下,您别无选择,只能使用接口(或仅使用Object),因为赋值运算符右侧的表达式的类型为Command。
在第二种情况下,您故意选择将结果分配给类型为 的变量A,即使您可以编写
B b = new B();
Run Code Online (Sandbox Code Playgroud)
这实际上只是设计选择的差异 - 它不会影响调用c.execute()或a.execute()实际的行为方式。