Зачем использовать абстрактный метод и переопределение, в то время как мы всегда можем использовать универсальный метод в суперклассе? - PullRequest
0 голосов
/ 05 мая 2018

Ниже приведен популярный пример использования абстрактного метода и переопределения.

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; 
    }
}

Кажется, что мы всегда можем достичь одного и того же, определив универсальный метод в суперклассе, который использует ключевое слово 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 {
}

Какой стиль кода лучше и почему?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Если вы сделаете последнее, ваши подклассы станут бесполезными. Они ничего не делают. Я хотел бы думать об этом так, родитель передал вам возможность выполнять methodA по-своему. Однако в вашем случае родитель делает все, что означает, что вы навсегда зависите от своего родителя. Кто бы этого хотел?

Кроме того, когда вы создаете новый подтип, вам нужно будет также отредактировать родителя (очень абсурдно), подумать о том, что произойдет через 100 подтипов позже. Дайте вашим подтипам силу иметь свою индивидуальность.

0 голосов
/ 05 мая 2018

Потому что:

  • вам не нужно изменять родительский класс каждый раз, когда вы добавляете другой подкласс
  • в некоторых случаях, таких как API библиотеки, вы можете даже не знать все подклассы
  • код, который имеет дело с подклассом, должен быть в этом подклассе, а не в родительском.
...