Наследование интерфейсов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Наследование интерфейсов

Сообщение gluhow » 19.02.2019 11:55:51

У меня в программе используется наследование интерфейсов друг от друга. При этом объект обладающий конечным интрефейсом, не считает что он обладает родительским интерфейсом. Например
Код: Выделить всё
program Project1;

type
  IIntf1=interface
  ['{A674A0AF-F02E-48E9-B4CC-1EEB953E0FF1}']
  end;

  IIntf2=interface(IIntf1)
  ['{2215CD62-B4CC-4209-B6BA-41BE8C492B07}']
  end;

  TMyClass=class(TInterfacedObject, IIntf2)

  end;

var MyClass:TMyClass;

begin
  MyClass:=TMyClass.Create;
  if MyClass is IIntf1 then
     WriteLn('Класс обладает интерфейсом IIntf1')
  else
    WriteLn('Класс не обладает интерфейсом IIntf1') //Выполнение по этой линии
end.



Это такая "фишка" или всё-таки "бага"?
gluhow
новенький
 
Сообщения: 32
Зарегистрирован: 13.08.2015 15:30:20

Re: Наследование интерфейсов

Сообщение Vadim » 19.02.2019 12:09:47

gluhow
Класс видит только предыдущего родителя-интерфейса. Если я ничего не путаю. Чтобы виделось всё, можно сделать так:
Код: Выделить всё
    program Project1;

    type
      IIntf1=interface
      ['{A674A0AF-F02E-48E9-B4CC-1EEB953E0FF1}']
      end;

      IIntf2=interface
      ['{2215CD62-B4CC-4209-B6BA-41BE8C492B07}']
      end;

      TMyClass=class(TInterfacedObject, IIntf2, IIntf2)

      end;

    var MyClass:TMyClass;

    begin
      MyClass:=TMyClass.Create;
      if MyClass is IIntf1 then
         WriteLn('Класс обладает интерфейсом IIntf1')
      else
        WriteLn('Класс не обладает интерфейсом IIntf1') //Выполнение по этой линии
    end.

Вообще, интерфейсы - это одна сплошная абстракция. Зачем их наследовать, какой смысл?
Vadim
долгожитель
 
Сообщения: 3745
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Наследование интерфейсов

Сообщение olegy123 » 19.02.2019 13:55:18

gluhow писал(а):Это такая "фишка" или всё-таки "бага"?

можно прилипить к разным не родственным объектам какое то общее свойство или общий метод.
аналог в сях множественное наследование.
olegy123
энтузиаст
 
Сообщения: 1486
Зарегистрирован: 25.02.2016 12:10:20

Re: Наследование интерфейсов

Сообщение gluhow » 20.02.2019 10:56:30

Vadim писал(а):Вообще, интерфейсы - это одна сплошная абстракция. Зачем их наследовать, какой смысл?

Есть некий общий интерфейс - в моём случае слово с данными, есть менее абстрактный интерфейс - слово с данными типа integer. При этом сами объекты обладающие данными интерфейсами совершенно разные и далеко не всегда родственники. Есть функции на вход которых подается слова с данными, есть функции которые работают только с целочисленными. Отсюда вытекло наследование интерфейсов. Только я не ожидал что в классах придется прописывать все интерфейсы, даже те что должны быть унаследованы. В документации тоже что-то не наткнулся на описание как это должно быть. Поэтому и пытаюсь понять оно так и должно работать? По моей логике - нет.
olegy123 писал(а):можно прилипить к разным не родственным объектам какое то общее свойство или общий метод.
аналог в сях множественное наследование.

По-моему Вы ответили не на мой вопрос
gluhow
новенький
 
Сообщения: 32
Зарегистрирован: 13.08.2015 15:30:20

Re: Наследование интерфейсов

Сообщение Vadim » 20.02.2019 11:13:10

gluhow писал(а):Только я не ожидал что в классах придется прописывать все интерфейсы, даже те что должны быть унаследованы. В документации тоже что-то не наткнулся на описание как это должно быть. Поэтому и пытаюсь понять оно так и должно работать? По моей логике - нет.

Увы нам всем, разработчики не пользовались Вашей логикой. :-D В Дельфях эту проблему тоже обсуждали весьма бурно. И там то как раз всем и рассказывали, что наследовать интерфейсы можно, но класс видит только ближайший и надо указывать все, чтобы было их видно.
Vadim
долгожитель
 
Сообщения: 3745
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Наследование интерфейсов

Сообщение Mirage » 22.02.2019 23:42:10

По мне так баг, но вроде как "by design".
Какие тут обсуждения. Я не могу придумать сколько-нибудь правдоподобного объяснения такому.
Для определения реализуется ли интерфейс существует странная функция Supports. Вроде работает.
Mirage
энтузиаст
 
Сообщения: 856
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Наследование интерфейсов

Сообщение java73 » 27.02.2019 11:37:43

То, что у вас необходимость НАСЛЕДОВАНИЯ аж интерфейсов , говорит только о неправильной проектировке системы и неверном определении классов для абстракций. Функции обработки названных у вас "слов" надо объявить в едином интерфейсе с едиными сигнатурами методов. Перебор объектов для обработки лучше реализовать Посетителями. Посетитель целочисленных будет обрабатывать только целочисленные данные, которые проверит его метод Accept. И т.д.
ну и в целом неверно на мой взгляд объявлять интерфейс для ДАННЫХ. Интерфейс нужен только для объявления взаимодействия.
java73
постоялец
 
Сообщения: 236
Зарегистрирован: 21.11.2013 09:08:10

Re: Наследование интерфейсов

Сообщение iskander » 28.02.2019 09:14:45

java73 писал(а):То, что у вас необходимость НАСЛЕДОВАНИЯ аж интерфейсов , говорит только о неправильной проектировке системы и неверном определении классов для абстракций.

Сильно сказано.
А вот ваш тёзка считает иначе :wink: :
docs.oracle.com
...
public interface Collection<E>
extends Iterable<E>
iskander
постоялец
 
Сообщения: 202
Зарегистрирован: 08.01.2012 18:43:34

Re: Наследование интерфейсов

Сообщение serbod » 28.02.2019 13:22:25

А чем вас обычные классы не устраивают?
Аватара пользователя
serbod
постоялец
 
Сообщения: 428
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Наследование интерфейсов

Сообщение gluhow » 04.03.2019 14:37:55

Mirage писал(а):Для определения реализуется ли интерфейс существует странная функция Supports. Вроде работает.
У меня она выдала тот же результат что и "is"
serbod писал(а):А чем вас обычные классы не устраивают?
Обычно действительно хватает, а в этом случае общий абстрактный класс нельзя сделать, поэтому и добавляю интерфейсы к готовым классам.
gluhow
новенький
 
Сообщения: 32
Зарегистрирован: 13.08.2015 15:30:20

Re: Наследование интерфейсов

Сообщение runewalsh » 05.03.2019 01:19:05

Это багофича, скопированная с Delphi, интерфейсы нужно указывать явно, даже если они отнаследованы один от другого:
Код: Выделить всё
TMyClass = class(IInterfacedObject, IIntf1, IIntf2)
Не уверен, нарушает это правила COM или нет, но в любом случае это ужасно.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 433
Зарегистрирован: 27.04.2010 00:15:25


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru