Re[3]: Is-a
От: matcode Беларусь  
Дата: 07.11.07 10:07
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, matcode, Вы писали:


M>>Неверно. Во всяком случае для C++


I>В твоем примере D и B не связаны отношением IsA.


Вообщем-то ты прав.
Мой пример скорее доказывает, что в C++ наследование не всегда являеться отношением "Is-a", другими словами наследник может быть не подтипом родителя и как следствие объект можно привести к типу не являющемуся его супертипом, что IMHO есть нарушение принципов ООП или по меньшей мере LSP уж точно.

Ну хорошо, не будем трогать наследование, собственно отношением "Is-a" даже в C++ можно выразить не только наследованием.
Тогда если немного дополнить оригинальное условие то оно будет почти соответствовать LSP.
А именно: "любое утверждение в терминах B,истинное для B, является истинным для D"
В это случае,например, "x is not D"
Автор: Кодёнок
Дата: 06.11.07
не катит, так это явно не терм из B.
Почему же почти, а не точно соответствовать LSP(Даже если не касться точности формулировки)?
Потому что LSP определяет, что при этом условии D будет подтипом B. Он не определяет, что только при этом условии, т.е. условие достаточное, но не необходимое. Поэтому сторого говоря обратное утверждение может быть не всегда верно.
Вывод:
без дополнениея — неверно
c дополнением — скорее верно, хотя зависит от точного определения, что такое "подтип"
Re[4]: Is-a
От: matcode Беларусь  
Дата: 07.11.07 10:28
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здравствуйте, matcode, Вы писали:


D>>>Если говорить о типах, а тип в свою очередь рассматривать как множество объектов, обладающих определенными свойствами, то да. В нотации теории множеств:

D>>>
D>>>B ={x | PB(x)}
D>>>D ={x | PD(x) /\ PB(x)}
D>>>

D>>>Подразумевается, что x берутся из большого универсума, и PB(x), PD(x) — предикаты над элементами универсума. Чтобы D было подмножеством (subtype) B необходимо, чтобы для любого его элемента выполнялся предикат PB(x).

M>>Подмножество и подтип не тождественные понятия.

M>>Простой пример: квадрат является подмножеством прямоугольника но не являеться его подтипом.
M>>Или например в С/С++ типы short и long.

D>Запиши определения того, что есть квадрат и что есть прямоугольник, на языке множеств c выделением по предикатам


Ну хорошо,
Множество прямоугольников можно определить так:

"Все x, принадалежащее множеству четырехугольников(что такое четырехугольник определять не буду) и имеющее прямые углы"

Множество квадратов так:

"Все x, принадалежащее множеству прямоугольников и имеющее равные стороны"

Только зачем это? Я просто указал что подмножество и подтип это не одно и то же.
Или ты не согласен?
Re[4]: Is-a
От: Кодёнок  
Дата: 07.11.07 10:40
Оценка:
Здравствуйте, matcode, Вы писали:

M>А именно: "любое утверждение в терминах B,истинное для B, является истинным для D"

M>В это случае,например, "x is not D"
Автор: Кодёнок
Дата: 06.11.07
не катит, так это явно не терм из B.


x.className == "B" — исключительно в терминах B, где Object.className — метод, возвращающий конечный уникальный тип объекта, или гуид, необходимый например, для сериализации.
Re[5]: Is-a
От: deniok Россия  
Дата: 07.11.07 10:49
Оценка:
Здравствуйте, matcode, Вы писали:

M>Здравствуйте, deniok, Вы писали:


D>>Запиши определения того, что есть квадрат и что есть прямоугольник, на языке множеств c выделением по предикатам


M>Ну хорошо,

M>Множество прямоугольников можно определить так:

M>"Все x, принадалежащее множеству четырехугольников(что такое четырехугольник определять не буду) и имеющее прямые углы"


M>Множество квадратов так:


M>"Все x, принадалежащее множеству прямоугольников и имеющее равные стороны"


M>Только зачем это? Я просто указал что подмножество и подтип это не одно и то же.

M>Или ты не согласен?

При том подходе, рамки которого я задал, определив тип как множество, — одно и то же.
Re[5]: Is-a
От: matcode Беларусь  
Дата: 07.11.07 11:53
Оценка: 2 (1)
Здравствуйте, Кодёнок, Вы писали:

Кё>Здравствуйте, matcode, Вы писали:


M>>А именно: "любое утверждение в терминах B,истинное для B, является истинным для D"

M>>В это случае,например, "x is not D"
Автор: Кодёнок
Дата: 06.11.07
не катит, так это явно не терм из B.


Кё>x.className == "B" — исключительно в терминах B, где Object.className — метод, возвращающий конечный уникальный тип объекта, или гуид, необходимый например, для сериализации.


Если найдеться такой y из D, для которого y.className == "B" ложно то D не будет подтипом B( точнее если это свойсто будет влиять на поведение программы), это следует из определения LSP. Кстати это пример разбираеться первым в статье по LSP.
Но я же говорю, что все зависит от определения подтипа. Из википедии

the supertype-subtype relation is often taken to be the one defined by the Liskov substitution principle; however, any given programming language may define its own notion of subtyping, or none at all.


Т.е. если мы определим "подтип" через LSP, то в твоем случае D это не подтип B. Если как-то по другому то вполне может.

Между прочем не так просто найти такие типы в рельном мире, которые буду имет отношение "Is-a" в соответствий с LSP.
Зачастую они могут удовлетворять этому отношению, только при определенных допущениях или при определенном использованиие(например когда не используться метаинформация).
Re[6]: Is-a
От: Кодёнок  
Дата: 07.11.07 12:57
Оценка:
Здравствуйте, matcode, Вы писали:

M>Т.е. если мы определим "подтип" через LSP, то в твоем случае D это не подтип B. Если как-то по другому то вполне может.


Если мы определим подтип через LSP, то подтипов не существует вообще. Считая, что B и D разные, если «B можно отличить от D», то утверждение q(x) = «(тип) x можно отличить от B» в общем случае доказывает, что LSP не выполняется при разных B и D никогда.
Re[5]: Is-a
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.11.07 07:11
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Здравствуйте, matcode, Вы писали:


M>>А именно: "любое утверждение в терминах B,истинное для B, является истинным для D"

M>>В это случае,например, "x is not D"
Автор: Кодёнок
Дата: 06.11.07
не катит, так это явно не терм из B.


Кё>x.className == "B" — исключительно в терминах B, где Object.className — метод, возвращающий конечный уникальный тип объекта, или гуид, необходимый например, для сериализации.

К сожалению, это утверждение не является универсально справедливым для всех экземпляров B.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Is-a
От: Кодёнок  
Дата: 12.11.07 08:04
Оценка:
Здравствуйте, Sinclair, Вы писали:

Кё>>x.className == "B" — исключительно в терминах B, где Object.className — метод, возвращающий конечный уникальный тип объекта, или гуид, необходимый например, для сериализации.

S>К сожалению, это утверждение не является универсально справедливым для всех экземпляров B.

Это как?
Re[5]: Is-a
От: Трурль  
Дата: 12.11.07 08:24
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>x.className == "B" — исключительно в терминах B, где Object.className — метод, возвращающий конечный уникальный тип объекта, или гуид, необходимый например, для сериализации.


Это утверждение не в терминах B и, вообще не в терминах классов. Это — утверждение метауровня.
Re[6]: Is-a
От: Кодёнок  
Дата: 12.11.07 08:37
Оценка:
Здравствуйте, Трурль, Вы писали:

Кё>>x.className == "B" — исключительно в терминах B, где Object.className — метод, возвращающий конечный уникальный тип объекта, или гуид, необходимый например, для сериализации.


Т>Это утверждение не в терминах B и, вообще не в терминах классов. Это — утверждение метауровня.


Что-то я тогда не очень понимаю ваше ООП. Дай пример утверждений в терминах классов?
Re[7]: Is-a
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.11.07 08:38
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Это как?

А так, что те экземпляры, точный тип которых входит в тип B, но не является им, не будут возвращать "B". Всего делов-то.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Is-a
От: Кодёнок  
Дата: 12.11.07 08:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

Кё>>Это как?

S>А так, что те экземпляры, точный тип которых входит в тип B, но не является им, не будут возвращать "B". Всего делов-то.

Так именно для этого я его и придумал. Чтобы для типа и подтипов могли возвращаться разные значения. Это показывает, что LSP не может выполняться для абсолютно любого утверждения.
Re[9]: Is-a
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.11.07 09:13
Оценка:
Здравствуйте, Кодёнок, Вы писали:
Кё>Так именно для этого я его и придумал. Чтобы для типа и подтипов могли возвращаться разные значения. Это показывает, что LSP не может выполняться для абсолютно любого утверждения.
LSP и не собиралось выполняться для вааще любого утверждения. Вот представь себе, что у тебя есть B и C, причем C — уже подтип B. Если мы добавляем D и хотим узнать, является ли он подтипом B, то в D можно проверять только утверждения, справедливые для экземпляров как B, так и C.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Is-a
От: Кодёнок  
Дата: 12.11.07 12:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

Кё>>Так именно для этого я его и придумал. Чтобы для типа и подтипов могли возвращаться разные значения. Это показывает, что LSP не может выполняться для абсолютно любого утверждения.

S>LSP и не собиралось выполняться для вааще любого утверждения. Вот представь себе, что у тебя есть B и C, причем C — уже подтип B. Если мы добавляем D и хотим узнать, является ли он подтипом B, то в D можно проверять только утверждения, справедливые для экземпляров как B, так и C.

Типа x.className != "D", которое справедливо как для B, так и для C?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.