[英]Declared base class/interface or implementation when creating objects?
这里我有这个问题。 假设代码1是具有运行时多态性的Java,代码2是没有运行时多态性的Java 。
代码1:
class A {
void run() { System.out.println("A is running"); }
}
class B extends A{
void run(){ System.out.println("B is running with A!");}
public static void main(String args[]){
A a = new B(); //referenced to class A
a.run();
}
}
代码2:
class A {
void run(){System.out.println("A is running");}
}
class B extends A{
void run(){ System.out.println("B is running with A!");}
public static void main(String args[]){
B a = new B(); //referenced to the same constructor class
a.run();
}
}
尽管这两个代码给出的结果完全相同,但是众所周知,运行时多态在OOP中确实很重要。 我需要使用代码1而不是代码2的解释/原因。
让我们来看这种情况:
您有多个从同一基类继承的类,即使它们是不同的类,也要在所有这些类上调用它们的共享函数run()
。
您必须这样做:
interface A{
void run();
}
class B implements A{
void run(){ System.out.println("B is running with A!");}
class C implements A{
void run(){ System.out.println("C is running with A!");}
public static void main(String args[]){
Array<A> objects = new Array<A>();
objects.put(new B()); //Object are stored as instances of "A"
objects.put(new C());
objects.put(new B());
for (A obj : objects)
obj.run();//Calls everything
}
在每种情况下,都不需要在OOP中利用多态。
多态是一种在需要灵活性时带来灵活性的机制。
例如,在您的情况下,编写:
B a = new B();
要么
A a = new B()
取决于您是否需要并且有兴趣引用基类,而不是引用子类作为变量的声明类型。
引用基类(此处为A
)可以在其中做很多事情(不是穷举,而是频繁的用例):
A
的C
或D
)而不会中断对客户端代码的调用。 在您的代码中,您无需执行此操作,但是在实际的应用程序中,您可以满足此需求。 A
和B
类的通用处理,则可以提出一个方法,该方法将类型A
的实例作为参数。 示例: public void doProcess(A instance)
B a = new B()
,则在语义上将此实例传递给该方法时,代码将不会编译,一个B
实例为A
但一个A
实例不一定为B
通常,我们可以读到声明接口而不是实现是一种好习惯。 实际上,在大多数情况下是这样,但在其他情况下则不是。 仅举一个例子,如果您需要使用TreeMap
,则不会声明接口Map
因为TreeMap
的行为非常具体并且有特殊要求,因此您可能需要强调一下。 通常,当实例化经典HashMap
,由于它的接口就足够了,因此您无需考虑将HashMap
声明为声明的类型。 您没有兴趣与实现创建更强大的耦合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.