Разница в выводе из абстрактного и неабстрактного класса - PullRequest
1 голос
/ 07 июня 2009

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

Спасибо

Ответы [ 6 ]

2 голосов
/ 07 июня 2009

Разница на самом деле довольно прагматична: абстрактный базовый класс - это класс, который никогда не предназначен для реализации, и поэтому не обязательно должен предоставлять полные реализации. Это означает, что ABC может определить контракт для производных классов без реализации класса.

Это удобно двумя способами:

  • вы можете определять абстрактные объекты, которые не имеют полной реализации, но делают утверждения относительно всего класса. Одним из примеров этого является наличие класса DrawItem с методом draw(), который является базовым классом для Circle, Rectangle и т. Д. DrawItem не может знать, как рисовать себя, потому что он не знает, что это .

  • вы можете определить классы, для которых вы можете иметь две конкретные реализации. Это отображается в шаблоне Proxy и может также использоваться для построения, например, фиктивных объектов для тестирования.

В наши дни для новых языков более распространено определение интерфейсов или модулей или mixins для этих вещей; оказывается, что использование ABC почти всегда попадает в сценарии использования этих более интуитивных концепций.

1 голос
/ 07 июня 2009

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

Здесь на самом деле есть параллель с частичным применением функций в функциональном программировании ...

1 голос
/ 07 июня 2009

у Пола Хара есть интересных предложений , таких как:

Не подклассифицировать конкретные классы

(прочитайте оригинал, я не хочу копировать и вставлять все; -).

Пол пишет о Java, но я обнаружил, что, по крайней мере, эта часть его совета применима к большинству задач проектирования ОО (хотя прагматично, я все еще иногда отклоняюсь от нее в кодировании , он жив и здоров в моем design ;-), даже когда я собираюсь реализовать его на C ++, Python или чем-то еще. Если после прочтения рассуждений Пола вы согласитесь с ним, в будущем вы будете использовать намного больше абстрактных классов (чтобы разрешить создание подклассов; -).

0 голосов
/ 07 июня 2009

, чтобы привести пример того, что я считаю уместным:

public abstract class CustomSocket()
{
    CustomSocket()
    {
    }

    public abstract void PleaseOverideMe(CustomSocketConnection c)
    {

    }

}
0 голосов
/ 07 июня 2009

То, что компилятор не позволит вам его создать?

0 голосов
/ 07 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...