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