Наследование классов

Demiurg

Guest
>Про агрегирование ни слова
плохо читал. может быть там используется другой термин?
 

Crazy

Developer
Автор оригинала: Screjet
Конечно, авто неля назвать особым видом карбюратора, но вот карбюратор и мотор и кузов и т.д. - это все является автомобилем.
Ты противоречишь сам себе. Если "Foo является Bar", то это в точности то же, что "Foo является особым видом Bar". Ты уж определись хоты бы с языком.

Ни карбюратор. ни мотор, ни кузов не являютяс автомобилем. Они являются частями автомобиля. Почувствуй разницу.
 

Crazy

Developer
Автор оригинала: Demiurg
Довай тогда не будем цепляться за термины, а решим имеет ли данный метод право на жизнь или нет.
Метод? Имеет. Если бы они не имел права на жизнь, то зачем бы его использовали? :)
 

Crazy

Developer
Автор оригинала: Demiurg
плохо читал. может быть там используется другой термин?
Насколько я помню книгу, по крайней мере первые два издания этот термин содержат.
 

Demiurg

Guest
> Если бы они не имел права на жизнь, то зачем бы его использовали?
ну так нечего его называть извращением :)
 

Screjet

Новичок
Автор оригинала: Crazy
Ни карбюратор. ни мотор, ни кузов не являютяс автомобилем.
Абсолютно солгасен, все дело в "и". Все в сборе вполне можно назвать автомобилем. Опять таки, здесь, кажись, нет строгой логики, болше философии..
 

tony2001

TeaM PHPClub
>Опять таки, здесь, кажись, нет строгой логики, болше философии..
никакой тут философии нет.
чистая логика.
 

Demiurg

Guest
Есть такой принцип подстановки Лисков, который гласит (в вольной интерпретации):
Если класс A является наследником класса B, то везде, где может стоять объект класса B может стоять и объект класса A.
 

Crazy

Developer
Автор оригинала: Demiurg
Есть такой принцип подстановки Лисков, который гласит (в вольной интерпретации):
Если класс A является наследником класса B, то везде, где может стоять объект класса B может стоять и объект класса A.
В принципе, эта штука выражает основной принцип наследования интерфейса (однако, задает несколько более общее понятие -- принцип совместимости типов при наследовании). Штука в том, что наследование реализации может приводить к несовместимости по типамю.

Если мне не изменяет память, в Eiffel допустима ситуация, когда класс B, наследуя класс A, удаляет из области видимости его публичный метод. Соответственно, B нельзя употреблять там, где требуется A. :)
 

Demiurg

Guest
Crazy, этот принцип не выполняется автоматически при использовании наследования. В с++ тоже можно скрывать методы. Однако надо стараться его не нарушать :)
 

Crazy

Developer
Не то чтобы "стараться не нарушать", а "не идти против здравого смысла". :)
 

Demiurg

Guest
просто "здравый" смысл у каждого свой. Вот некоторые считают, что машина наследник колеса :). А принцип он и есть принцип выражен в строгих словах.
 

sokol

Zavolga.Net
Автор оригинала: Crazy
Я тебя за язык не тянул. Ищи.


Делегирование и агрегация вместе составляют механизм наследования реализации. В ряде языков это слияние сделано невидимым для глаза. :)

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

P.S.: В выходные поищу:) Эх, я бы почаще сюда, жаль времени нет...
 

Varg

Guest
Эх... Ну мужи учёные, разъясните мне пожалуйста вкратце пару вещей. Терминологию.

неследование реализации и наследование интерфейса - в чём разница? Пока что я знаю из более менее нормальных языков лишь ПХП. Хотелось бы понять.

На уровне программирования в классы (да и в идею ООП в целом) я въехал совсем недавно и только научился использовать. А вот теория... В общем что есть a extends b это наследование - это я понял. А что есть (как называется по русски) a::foo() ? И что есть Делегирование и агрегация? Куча терминов а понятно ну никак :)

И не смейтесь! А то встану в позу и уйду :)))
 

Varg

Guest
И ещё, где именно в ПХП вы использовали эффективно классы? Где это было действительно нужно?
 

Demiurg

Guest
Читайте классиков. Если все на пальцах объяснять, то будет самый длинный тред за всю историю форума.
 

Crazy

Developer
Автор оригинала: Varg
неследование реализации и наследование интерфейса - в чём разница? Пока что я знаю из более менее нормальных языков лишь ПХП. Хотелось бы понять.
Наследование интерфейса существует (и имеет смысл) только в языках с жесткой типизацией. Общий принцип: если класс B есть наследник класса A, то везде, где разрешено использование класса A, можно использовать класс B.

Наследование реализации означает, что в классе B существуют все атрибуты и методы класса A (но часть их может быть недоступна ввиду наложенных ограничений).

Обычно интерфейс и реализация наследуются вместе. Но бывают и иные варианты:

1. Класс B должен использоваться вместо класса A, но он реализован совершенно иначе. Наследовать реализацию в этом случае нет смысла.

2. Класс B имеет функциональность, несколько отличающуюся от функциональности A, но по смыслу задачи B нельзя использовать вместо A. В этом случае вредно наследовать интерфейс.
 
Сверху