繁体   English   中英

创建对象时声明了基类/接口或实现?

[英]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 )可以在其中做很多事情(不是穷举,而是频繁的用例):

  • 屏蔽实现(通过工厂或注入依赖性)。 这样,您可以更改实现(返回扩展ACD )而不会中断对客户端代码的调用。 在您的代码中,您无需执行此操作,但是在实际的应用程序中,您可以满足此需求。
  • 如果您具有AB类的通用处理,则可以提出一个方法,该方法将类型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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM