Почему абстрактные классы в первую очередь? - PullRequest
0 голосов
/ 04 января 2019

Я знаю о концептуальном использовании, лежащем в основе создания абстрактного класса, то есть определения общего интерфейса для его подклассов, где часть реализации оставлена ​​отдельным подклассам.

Правильно ли я полагаю, что естьтехнически нет необходимости в абстрактных классах, так как вы все равно можете переписать метод суперкласса?Были ли просто созданы абстрактные классы, чтобы сделать их понятными для разработчика?

Пример того, что я имею в виду:

// Using an abstract class
abstract class Car
{
    int fuel;

    int getFuel()
    {
         return this.fuel;
    }

    abstract String getColor();
}

class RedCar extends Car
{
    String getColor()
    {
        return "red";
    }
}


// Without an abstract class
class Car
{
    int fuel;

    int getFuel()
    {
         return this.fuel;
    }

    String getColor()
    {
         return "defaultColor";
    }

class RedCar extends Car
{
    String getColor()
    {
        return "red";
    }
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Большинство людей, которых я знаю, избегают абстрактных классов.С точки зрения разработчиков приложений, мое мнение состоит в том, что следует избегать абстрактных классов.Использование интерфейсов намного более гибко, не заставляя вашу работу придерживаться иерархии классов.

немного формально: абстрактный класс строгий наследование , а интерфейсы композиция .

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

0 голосов
/ 04 января 2019

Были ли абстрактные классы только что созданы, чтобы сделать их понятными для разработчика?

Это верно, но это также мешает разработчикам делать "глупые" вещи.

Например, вы не можете создавать экземпляры абстрактных классов.В контексте вашего кода не имеет смысла создавать «общие» Car.Вы можете создать только BlueCar, RedCar или какой-либо другой подкласс.Хотя экземпляры анонимного подкласса могут показаться экземплярами абстрактных классов, в конце концов они построены из подклассов .Однако если вы сделали абстрагированный класс Car, разработчики не будут случайно создавать экземпляр Car, потому что компилятор будет жаловаться.

Абстрактные классы также заставляют разработчиков реализовывать абстрактные методы.С вашим неабстрактным Car классом я могу наследовать его и забыть, что мне нужно переопределить getColor.Теперь некоторые другие части кода могут вызвать getColor и получить бессмысленный результат «defaultcolor».Какого черта это цвет по умолчанию?Создание абстрактного метода заставляет подклассы задуматься о реализации необходимых методов.

...