java - 当我们总是可以在父类(super class)中使用泛型方法时,为什么要费心使用抽象方法和重写呢?

标签 java overriding abstract

以下是涉及抽象方法和重写的流行用例。

class Demo {
    public static void main(String[] args) {
        Parent a = new Child_A();
        Parent b = new Child_B();
        a.method();
        b.method();
    }
}

abstract class Parent {
    abstract void method();
}

class Child_A extends Parent {
    @override
    void method() {
        do the task for Child_A; 
    }
}

class Child_B extends Parent {
    @override
    void method() {
        do the task for Child_B; 
    }
}

看来我们总是可以通过在父类(super class)中定义一个泛型方法来实现同样的事情,该方法使用instanceof关键字来确定子类并为子类执行相应的任务。

class Demo {
    public static void main(String[] args) {
        Parent a = new Child_A();
        Parent b = new Child_B();
        a.method();
        b.method();
    }
}

class Parent {
    void method() {
        if (this instanceof Child_A) {
            do the task for Child_A;
        }
        else if (this instanceof Child_B) {
            do the task for Child_B;
        }            
    }
}

class Child_A extends Parent {
}

class Child_B extends Parent {
}

哪种代码风格更好,为什么?

最佳答案

因为:

  • 您不想每次添加另一个子类时都必须修改父类
  • 在某些情况下,例如库 API,您甚至可能不知道所有子类
  • 处理子类的代码应该位于该子类中,而不是位于父类中。

关于java - 当我们总是可以在父类(super class)中使用泛型方法时,为什么要费心使用抽象方法和重写呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50183641/

相关文章:

java - 什么时候使用 Java 的 @Override 注解?为什么?

java - 如果方法是事务性的,则 Spring 无法实例化 bean

c# - 调用多态类字段事件

Android:覆盖 shouldOverrideUrlLoading 在 HTC 设备上不起作用

c# - 开放通用类型是否被认为是具体的?我们如何通过参数化来限定抽象?

vb.net - MustOverride 属性的私有(private)或 protected 集

java - 遍历 Prim 的 MST 算法的邻接矩阵

java - 无法读取 FileWriter 之后生成的 csv 文件并在 Java 中找到重复项

android override textView根据getMaxLines设置文本

java - 抽象类中的私有(private)构造函数