Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Каким образом в Delphi класс реализует интерфейс?

375
25 сентября 2005 года
dominator
199 / / 16.10.2003
Использовал интерфейсы, когда писал на JScript.NET. Там, когда класс реализует какой-либо интерфейс, он, как и положено, обязан реализовать все методы описанные в интерфейсе. Но, помимо этого, в случае, когда некий класс является потомком другого класса, и в то же время реализует какой-либо интерфейс, этот интерфейс накладывает на класс ограничения, связанные с тем, что все те, методы, что объявлены в родительском классе, и унаследованны потомком, но не описаны в интерфейсе, становятся недоступны классу-потомку. Т.е. в данном случае интерфейс является как бы фильтром, отсекающим лишние методы и свойства класса-родителя для класса-наследника.

Пробую реализовать нечто подобное на Delphi.
К примеру, описан следующий класс:
type
TMyClass = class(TInterfacedObject)
private
{ Private declarations }
public
procedure Method1();
procedure Method2();
end;

И следующий интерфейс:
type
IDataBase = interface
procedure Method1();
end;

Описываю еще один класс, родительским для которого является TMyClass:
type
TMyInterfacedChildrenClass = class(TMyClass, IDataBase)
private
{ Private declarations }
public
{ Public declarations }
end;

Однако что же выходит:
в разделе объявлений -

var ocTMyInterfacedChildrenClass :TMyInterfacedChildrenClass;

в разделе реализации -

ocTMyInterfacedChildrenClass := TMyInterfacedChildrenClass.Create();
ocTMyInterfacedChildrenClass.Method2();
и это не вызывает недовольства компилятора.
Следовательно, реализация интерфейса не ограничивает методы класса-родителя для наследника?
А как в Delphi принято поступать в случае, когда в родительском классе описаны методы и свойства совершенно не нужные в дочернем классе?
5
26 сентября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by dominator
А как в Delphi принято поступать в случае, когда в родительском классе описаны методы и свойства совершенно не нужные в дочернем классе?


со свойствами всё просто:

 
Код:
TBaseClass = class
    public
      property SomeProperty: TPropertyType read GetSomeProperty write SetSomeProperty;
  end;

  TMyClass = class(TBaseClass)
    protected
      property SomeProperty;
  end;

А спрятать методы... Когда-то в подобной ситуации я просто переопределил виртуальный метод в protected секции.
10
30 сентября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by dominator
Пробую реализовать нечто подобное на Delphi.
К примеру, описан следующий класс:
type
TMyClass = class(TInterfacedObject)
private
{ Private declarations }
public
procedure Method1();
procedure Method2();
end;

И следующий интерфейс:
type
IDataBase = interface
procedure Method1();
end;

Описываю еще один класс, родительским для которого является TMyClass:
type
TMyInterfacedChildrenClass = class(TMyClass, IDataBase)
private
{ Private declarations }
public
{ Public declarations }
end;

Однако что же выходит:
в разделе объявлений -

var ocTMyInterfacedChildrenClass :TMyInterfacedChildrenClass;


Приведенный пример некорректен. Не буду еще раз объяснять прописные истины - перечитай еще раз про классы и интерфейсы в Дельфи, хотя бы в его справке. А для начала:

 
Код:
var
  DBFace: IDataBase;
begin
  DBFace.Method2; // вызывает исключение при компиляции
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог