#1
28 ноября 2009 в 16:00
Недавно, я с другом обсуждал наследование в java. <br /><br />Известно, что множественное наследование в java недопустимо, но его можно реализовать посредством интерфейсов. <br />Насколько последнее справедливо? Я не очень хорошо знаком с ООП и начал рыть интернет на предмет интерфейсов. <br /><br />Я вычитал, что один интерфейс может наследовать другой. Таким образом можно получить упаковку типов-"матрешек" с методами и заставить некий класс реализовать их. <br /><br />Однако, интерфейс не содержит данных - только методы. Следовательно, реализовать полноценное множественное наследование с помощью интерфейсов невозможно!? <br /><br />Прошу внести ясность :)
#2
28 ноября 2009 в 23:22
По поводу Java не знаю, в Delphi дело обстоит так.<br />Интерфейс, это некоторое объявление методов, но не сами методы. Когда ты наследуешь класс от интерфейса, это значит, что ты обязуешься в классе все эти методы реализовать.<br />Далее это обозначает, что данный класс "поддерживает" или "реализует" данный интерфейс.<br />Для чего это надо? Ты можешь взять два класса, у которых либо о-о-о-о-о-очень далекий общий предок, либо такого вообще не имеется и реализовать в этих классах нужный тебе интерфейс. Теперь, несмотря на то, что в иерархии классов, эти два класса близко не стояли, у них есть реализация одного и того же интерфейса. <br />Теперь можно завести переменную, ссылающуюся на объект по типу интерфейса и далее в такую переменную можно присвоить ссылку на любой объект, класс которого поддерживает данный интерфейс.<br /><br />А наследование интерфейсов это просто. От первого интерфейса наследовал второй, это значит, что когда будешь наследовать класс от второго интерфейса, то тебе придется реализовать методы их обоих.
#3
29 ноября 2009 в 06:20
Меня заинтересовал вот этот момент: <br />
Теперь можно завести переменную, ссылающуюся на объект по типу интерфейса и далее в такую переменную можно присвоить ссылку на любой объект, класс которого поддерживает данный интерфейс.<br />Можно иллюстрацию цитаты ? На дельфи или на чем угодно. <br />
#4
29 ноября 2009 в 13:22
[quote author=BFG10K link=topic=598.msg13057#msg13057 date=1259475657]<br />Меня заинтересовал вот этот момент: Можно иллюстрацию цитаты ? На дельфи или на чем угодно. <br />[/quote]<br />Интерфейсы в Delphi принято начинать с буквы "I", классы с "T". Пример отображает только идею. Не работающий:<br />
<br />type<br /> IMyInterface = interface<br /> function GetText : string;<br /> end;<br /> <br /> TMyLabel = class(TLabel, IMyInterface)<br /> function GetText: string;<br /> end;<br /> <br /> TMyStrings = class(TStringList,IMyInterface)<br /> function GetText: string;<br /> end;<br /> <br />function TMyLabel.GetText: string;<br />begin<br /> Result := Caption;<br />end;<br /><br />function GetText: string;<br />begin<br /> Result := Text;<br />end;<br /><br /><br />var every : IMyInterface;<br />begin<br /> every := TMyLabel.Create(nil);<br /> TMyLabel(every).Caption := 'It is TLabel component';<br /> ShowMessage(every.GetText);<br /> <br /> every := TMyStringList.Create;<br /> TMyStringList(every).Text := 'It is TStringList class';<br /> ShowMessage(every.GetText);<br />end.<br />
<br />
#5
10 декабря 2009 в 08:34
А вот еще интересный момент: <br />если я имплементирую в своем классе какой-нибудь стандартный класс, то это значит, что я в некотором роде перегружу его родные методы? <br /><br />Например: <br />
class MyClass implements Runnable {<br /> public void run() { <br /> }<br />}
#6
13 декабря 2009 в 12:43
С билдером не знаком.<br />По идее, если указываешь методы с теми же самыми именами, то да (если под имплементацией понимается наследование).<br />Есть виртуальные+динамические методы и статические. Соответственно перегрузка зависит от того, к какому типу относится метод.