Как смоделировать универсальность, используя наследование? - PullRequest
2 голосов
/ 14 июня 2011

Я не понимаю, как имитировать родовое происхождение с помощью наследования, я консультируюсь со статьей Бертана Мейера «Обобщение и наследование», но я до сих пор не понимаю этого. Я бы оценил более четкое объяснение.

Ответы [ 3 ]

1 голос
/ 14 июня 2011

В некоторых языках программирования вы можете моделировать genericy, используя наследование с членами абстрактного типа.Вот пример использования scala.Это должно быть понятно, даже если вы не знаете scala.

class Collection {
type T;
//all methods are using T for the contained type.
}

Я не уверен, но в c ++ type будет typedef.Следуя этому подходу, вы можете получить коллекцию с элементами типа A, подтипировав коллекцию и указав тип T для A:

class IntCollection extends Collection {
type T = Int; 
//...
}

. Это решение имеет некоторые недостатки по отношению к шаблонам или шаблонам, но также имеет свои преимущества.Если вам интересно, подумайте о прочтении этого: http://www.artima.com/weblogs/viewpost.jsp?thread=270195 Элементы абстрактного типа в сравнении с параметрами общего типа в scala.Опять же, вам не нужно знать Scala, чтобы понять пост.edit: процитировать только одно предложение: по крайней мере, в принципе, мы можем выразить каждый вид параметризации как форму объектно-ориентированной абстракции.Надеюсь, что это помогло

1 голос
/ 14 июня 2011

Обобщения необходимы только в статических типизированных языках (или в тех, у которых есть подсказки типов) - потому что вы не хотите потерять эту едва полученную безопасность типов.

Если ваш (статический) язык не имеет их, возможно, пришло время подумать о другом - имитация с использованием наследования - это ужасный хак.

Или лучше - подумайте о динамических языках и тестируемой разработке. Вы получите гораздо больше возможностей (все является общим, нет необходимости печатать), и тесты будут представлять ваш контракт - включая конкретные примеры - что просто не может сделать даже лучшая абстракция с безопасным типом. (потому что это абстрактно)

0 голосов
/ 14 июня 2011

В общем случае вы не можете это сделать.Вот почему в ОО-языках были добавлены шаблоны и шаблоны.Например, все попытки создания универсальных контейнеров в C ++ до введения шаблонов провалились или были почти полностью бесполезны.

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