Welcome, guest. You can be a Login или register
Author
Topic title
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Недавно, я с другом обсуждал наследование в java.

Известно, что множественное наследование в java недопустимо, но его можно реализовать посредством интерфейсов.
Насколько последнее справедливо? Я не очень хорошо знаком с ООП и начал рыть интернет на предмет интерфейсов.

Я вычитал, что один интерфейс может наследовать другой. Таким образом можно получить упаковку типов-"матрешек" с методами и заставить некий класс реализовать их.

Однако, интерфейс не содержит данных - только методы. Следовательно, реализовать полноценное множественное наследование с помощью интерфейсов невозможно!?

Прошу внести ясность :)
digs
Offline
Q1 Forever
603 posts
Karma 18
По поводу Java не знаю, в Delphi дело обстоит так.
Интерфейс, это некоторое объявление методов, но не сами методы. Когда ты наследуешь класс от интерфейса, это значит, что ты обязуешься в классе все эти методы реализовать.
Далее это обозначает, что данный класс "поддерживает" или "реализует" данный интерфейс.
Для чего это надо? Ты можешь взять два класса, у которых либо о-о-о-о-о-очень далекий общий предок, либо такого вообще не имеется и реализовать в этих классах нужный тебе интерфейс. Теперь, несмотря на то, что в иерархии классов, эти два класса близко не стояли, у них есть реализация одного и того же интерфейса.
Теперь можно завести переменную, ссылающуюся на объект по типу интерфейса и далее в такую переменную можно присвоить ссылку на любой объект, класс которого поддерживает данный интерфейс.

А наследование интерфейсов это просто. От первого интерфейса наследовал второй, это значит, что когда будешь наследовать класс от второго интерфейса, то тебе придется реализовать методы их обоих.
my maps
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Меня заинтересовал вот этот момент:
Теперь можно завести переменную, ссылающуюся на объект по типу интерфейса и далее в такую переменную можно присвоить ссылку на любой объект, класс которого поддерживает данный интерфейс.

Можно иллюстрацию цитаты ? На дельфи или на чем угодно.
digs
Offline
Q1 Forever
603 posts
Karma 18
[quote author=BFG10K link=topic=598.msg13057#msg13057 date=1259475657]
Меня заинтересовал вот этот момент: Можно иллюстрацию цитаты ? На дельфи или на чем угодно.
[/quote]
Интерфейсы в Delphi принято начинать с буквы "I", классы с "T". Пример отображает только идею. Не работающий:

type
IMyInterface = interface
function GetText : string;
end;

TMyLabel = class(TLabel, IMyInterface)
function GetText: string;
end;

TMyStrings = class(TStringList,IMyInterface)
function GetText: string;
end;

function TMyLabel.GetText: string;
begin
Result := Caption;
end;

function GetText: string;
begin
Result := Text;
end;


var every : IMyInterface;
begin
every := TMyLabel.Create(nil);
TMyLabel(every).Caption := 'It is TLabel component';
ShowMessage(every.GetText);

every := TMyStringList.Create;
TMyStringList(every).Text := 'It is TStringList class';
ShowMessage(every.GetText);
end.

my maps
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
А вот еще интересный момент:
если я имплементирую в своем классе какой-нибудь стандартный класс, то это значит, что я в некотором роде перегружу его родные методы?

Например:
class MyClass implements Runnable {
public void run() {
}
}
digs
Offline
Q1 Forever
603 posts
Karma 18
С билдером не знаком.
По идее, если указываешь методы с теми же самыми именами, то да (если под имплементацией понимается наследование).
Есть виртуальные+динамические методы и статические. Соответственно перегрузка зависит от того, к какому типу относится метод.
my maps