Это
![]() | В данной статье поднимается несколько вопросов. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В компонентах представления знаний и онтологии , в том числе для объектно-ориентированного программирования и проектирования , is-a (также пишется как is_a или is a ) является субсумптивным. [а] отношения между абстракциями (например, типами , классами ), где один класс A является подклассом другого класса B (и, следовательно, является суперклассом A ) B . Другими словами, тип A является подтипом типа B, когда спецификация A подразумевает спецификацию B. То есть любой объект (или класс), удовлетворяющий спецификации A, также удовлетворяет спецификации B, поскольку спецификация B более слабая. [1]
Например, кошка «является» животным, но не наоборот. Все кошки — животные, но не все животные — кошки. Поведение, подходящее для всех животных, определяется в классе животных, тогда как поведение, подходящее только для кошек, определяется в классе кошек. Определив класс кошек как «расширение» класса животных, все кошки «наследуют» поведение, определенное для животных, без необходимости явно кодировать это поведение для кошек.
Связанные понятия [ править ]
Отношения is-a следует противопоставлять отношениям has-a ( has_a или has a ) между типами (классами); Путаница отношений has-a и is-a является распространенной ошибкой при разработке модели (например, компьютерной программы ) реальных отношений между объектом и его подчиненным. Отношения is-a также можно противопоставить отношениям экземпляра между объектами (экземплярами) и типами (классами): см. Различие типа и токена .
Подводя итоги отношений, можно выделить:
- гипероним – гипоним (супертип/суперкласс–подтип/подкласс) отношения между типами (классами), определяющие таксономическую иерархию, где
- для отношения включения : гипоним (подтип, подкласс) имеет отношение типа ( is-a ) со своим гиперонимом (супертипом, суперклассом);
- холоним – мероним (целое/сущность/контейнер-часть/составляющая/член) отношения между типами (классами), определяющие притяжательную иерархию, где
- для отношения агрегации (т.е. без владения):
- холоним (целое) имеет отношение к своему мерониму (части),
- для отношения композиции (т.е. с правом собственности):
- мероним (составляющая) имеет отношение части со своим холонимом (субъектом),
- для сдерживания [2] связь:
- мероним (член) имеет отношение член-из со своим холонимом ( контейнер );
- для отношения агрегации (т.е. без владения):
- отношения понятие-объект (тип-токен) между типами (классами) и объектами (экземплярами), где
- токен (объект) имеет отношение экземпляра со своим типом (классом).
Примеры подтипов [ править ]
Подтипирование позволяет заменить данный тип другим типом или абстракцией. Говорят, что подтипирование устанавливает связь между подтипом и некоторой существующей абстракцией, явно или неявно, в зависимости от языковой поддержки. Отношения могут быть выражены явно через наследование в языках, которые поддерживают наследование как механизм подтипирования.
С++ [ править ]
Следующий код C++ устанавливает явные отношения наследования между классами B и A , где B является одновременно подклассом и подтипом A и может использоваться как A везде, где указан B (через ссылку, указатель или сам объект). ).
класс A
{ общественный :
недействительный DoSomethingALike () const {}
};
класс B : общественный A
{ общественный :
недействительный DoSomethingBLike () const {}
};
void UseAnA ( A const & some_A )
{
some_A . СделатьЧто-нибудьAlike ();
}
void SomeFunc ()
{
B b ;
УсеАнА ( б ); // b можно заменить на A.
}
Питон [ править ]
Следующий код Python устанавливает явные отношения наследования между классами B и A , где B является одновременно подклассом и подтипом A и может использоваться как A везде, где B. требуется
класс A :
защита do_something_a_like ( self ):
передать
класс B ( A ):
защита do_something_b_like ( self ):
передать
защиту use_an_a ( some_a ):
some_a . do_something_a_like ()
def some_func ():
b = B ()
use_an_a ( b ) # b можно заменить на A.
В следующем примере type(a) — это «обычный» тип, а type(type(a)) — метатип. Хотя при распространении все типы имеют один и тот же метатип ( PyType_Type , который также является собственным метатипом), это не является обязательным требованием. Тип классических классов, известный какtypes.ClassType , также можно считать отдельным метатипом. [4]
>>> a = 0
>>> тип ( a )
<тип 'int'>
>>> тип ( тип ( a ))
<тип 'тип'>
>>> тип ( тип ( тип ( a )))
<тип 'тип'>
>>> тип ( тип ( тип ( тип ( a ))))
<тип 'тип'>
Ява [ править ]
В Java is- отношение между параметрами типа одного класса или интерфейса и параметрами типа другого определяется предложениями расширения и реализации .
Используя Collections
занятия, ArrayList<E>
реализует List<E>
, и List<E>
простирается Collection<E>
. Так ArrayList<String>
является подтипом List<String>
, который является подтипом Collection<String>
. Отношения подтипов сохраняются между типами автоматически. При определении интерфейса PayloadList
, который связывает необязательное значение универсального типа P с каждым элементом, его объявление может выглядеть так:
интерфейс PayloadList < E , P > расширяет список <E> { ;
void setPayload ( int index , P val )
...
}
Следующие параметризации PayloadList являются подтипами List<String>
:
PayloadList < String , String >
PayloadList < String , Integer >
PayloadList < String , Exception >
Принцип замены Лискова [ править ]
Принцип замены Лискова объясняет следующее свойство: «Если для каждого объекта o1 типа S существует объект o2 типа T такой, что для всех программ P, определенных в терминах T, поведение P не меняется, когда o1 заменяется на o2, тогда S является подтипом T», . [5] Следующий пример показывает нарушение LSP.
Вот, пожалуй, пример нарушения LSP:
класс Rectangle
{
public :
void SetWidth ( double w ) { itsWidth = w ; }
void SetHeight ( двойной час ) { itsHeight = час ; }
Double GetHeight () const { return itsHeight ; }
Double GetWidth () const { return itsWidth ; }
Double GetArea () const { return GetHeight () * GetWidth (); }
Частное :
удвоить свою ширину ;
удвоить его высоту ;
};
С точки зрения программирования класс Square может быть реализован путем наследования класса Rectangle.
общественный класс Square : Rectangle
{
public :
virtual void SetWidth ( double w );
виртуальная пустота SetHeight ( double h );
};
void Square::SetWidth ( double w )
{
Rectangle :: SetWidth ( w );
Прямоугольник :: SetHeight ( w );
}
void Square::SetHeight ( double h )
{
Rectangle :: SetHeight ( h );
Прямоугольник :: SetWidth ( h );
}
Однако это нарушает LSP, хотя is-a. между Rectangle и Square сохраняется отношение
Рассмотрим следующий пример, где функция g не работает, если ей передан квадрат, и поэтому принцип открытости-закрытости можно считать нарушенным.
пустота г ( Прямоугольник & р )
{
р . SetWidth ( 5 );
р . УстановитьВысоту ( 4 );
утверждать ( r . GetArea ()) == 20 ); // утверждение не удастся
}
И наоборот, если учесть, что тип фигуры должен ограничивать только соотношение ее размеров, то предположение в g() о том, что SetHeight будет изменять высоту и площадь, но не ширину, является недопустимым, а не только для настоящих квадратов, но даже потенциально для других прямоугольников, которые могут быть закодированы так, чтобы сохранять площадь или соотношение сторон при изменении высоты.
См. также [ править ]
- Наследование (объектно-ориентированное программирование)
- Принцип замены Лискова (в объектно-ориентированном программировании )
- Подчинение
- Это
- Гипернимия (и супертип )
- Гипонимия (и подтип )
- Имеет
Примечания [ править ]
- ^ См. Принцип замены Лискова .
- ^ «Подтипы и подклассы» (PDF) . MIT OCW . Проверено 2 октября 2012 г.
- ^ См. также «Сдерживание» (компьютерное программирование) .
- ^ Митчелл, Джон (2002). «10 «Концепции объектно-ориентированных языков» ». Понятия в языке программирования . Кембридж, Великобритания: Издательство Кембриджского университета. п. 287. ИСБН 0-521-78098-5 .
- ^ Гвидо ван Россум. «Подтипирование встроенных типов» . Проверено 2 октября 2012 г.
- ^ Лисков, Барбара (май 1988 г.). Абстракция данных и иерархия (PDF) . Уведомления SIGPLAN. Архивировано из оригинала 21 июня 2020 г.
{{cite book}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ «Принцип замены Лискова» (PDF) . Роберт К. Мартин, 1996. Архивировано из оригинала (PDF) 5 сентября 2015 года . Проверено 2 октября 2012 г.
Ссылки [ править ]
- Рональд Дж. Брахман ; « Что есть и чем не является IS-A. Анализ таксономических связей в семантических сетях ». Компьютер IEEE, 16 (10); Октябрь 1983 г.
- Жан-Люк Эно, Жан-Марк Хик, Винсент Энглеберт, Жан Анрард, Дидье Роланд: Понимание реализации отношений IS-A . ЕР 1996: 42-57.