Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2014, 09:41   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Вопрос Наследование интерфесов одного объекта

Всем доброго времени суток!

Разрабатываю архитектуру ПО. Возник вопрос, допустим есть некий интерфейс IInterf, и объект TInterf реализующий его. Спустя некоторое время я расширяю интерфейс IInterf, создав IInterf2 с новыми методами и свойствами.

У меня 2 интерфейса(старый и новый) и всего 1 объект.

Чтобы новый интерфейс работал его просто надо объявить в реализации класса TInterf?

Было:
Код:
type TInterf = class(..., IInterf)
стало:
Код:
type TInterf = class(..., IInterf, IInterf2)

Но интерфейса все равно 2, а объект 1. Когда я определю переменные с разными интерфейсами но создам им по одному и тому же объекту, компилятор разберется сам что там-то показать новый метод, а там-то нет?

Код:
var
  i:IInterf;
  j:Iinterf2;
begin
  I:= TIntrf.Create;
  I.CallNewMethod(); //Здесь будет ошибка, CallNewMethod не объявлен в IInterf
  J := TInterf.Create;
  J.CallNewMethod(); //Здесь все хорошо, CallNewMethod объявлен в IInterf2
end;
Правильно ли я делаю или нет?
Человек_Борща вне форума Ответить с цитированием
Старый 14.06.2014, 10:10   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

все не правильно, а главное не понятно в чем вопрос

а так естественно что интерфейсная ссылка знает только о своем, а не о соседях
eval вне форума Ответить с цитированием
Старый 14.06.2014, 10:15   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вообще-то должен разобраться.
Цитата:
все не правильно
А почему не правильно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.06.2014, 10:24   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а что тут правильно?
Цитата:
Чтобы новый интерфейс работал его просто надо объявить в реализации класса TInterf?
этого мало, реализацию делать надо
ну и тд
eval вне форума Ответить с цитированием
Старый 14.06.2014, 10:26   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
все не правильно, а главное не понятно в чем вопрос
Как правильно?

У меня есть объект TInterf реализующий интерфейс IInterf. Спустя время X я понял что надо добавить в интерфейс ещё больше методов и свойств, но т.к. это интерфейсы для разработчиков, то я не могу взять и поменять базовый IInterf... уже написанные модули с использованием IInterf просто перестанут работать.

На объявляю IInterf2 и наследую его от IInterf, и описываю все нововведения.
В обявлении класса TInterf я указываю ещё IInterf2. Все.

Но TInterf по прежнему один.... а интерфейса уже 2 или 5 или 10, в зависимости от того как часто будет пересматриваться структура интерфейсов.

Допустим разработчик хочет чтобы ядро приложения вернула ему именно новый интерфейс, а не старый. Как это делать?
Человек_Борща вне форума Ответить с цитированием
Старый 14.06.2014, 10:30   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

дык привидение типов с интерфейсами никто не отменял
квериинтерфейс можно делать
и тд
eval вне форума Ответить с цитированием
Старый 14.06.2014, 10:56   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

eval, все это круто. Но интерфейсы как бы это сказать... должны дружить с C++,С# и прочими способными импортировать библиотеки типов.
Человек_Борща вне форума Ответить с цитированием
Старый 14.06.2014, 11:01   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

тогда com
eval вне форума Ответить с цитированием
Старый 14.06.2014, 11:30   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Это не отменяет проблемы Как создать объект реализующий IInterf2? Не плодить же сами объекты.... TInterf2, TInterf3 и т.д....
Хотя бы потому, что технология интерфейсов как раз и предполагает что 1 объект может реализовывать 100500 интерфейсов.
Человек_Борща вне форума Ответить с цитированием
Старый 14.06.2014, 11:35   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

вы разницу между понятиями объект и тип я вижу не понимаете

по теме - в чем вопрос? посмотрите например как сделан документ в webbrowser (импортируйте тлб) я так понимаю типа ваш случай
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скорость одного объекта относительно другого Anton911 Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 17.07.2012 03:18
Виртуальное наследование и автоматическое обнуление объекта coNsept Общие вопросы C/C++ 8 20.06.2012 15:14
Как передать управление из одного объекта в другой? wolf05632 Microsoft Office Word 16 10.04.2011 08:21
Использование одного объекта в двух потоках Anekdot Общие вопросы Delphi 0 16.03.2010 19:37
Перекрытие одного объекта другим Djem1991 Общие вопросы Delphi 3 11.06.2009 13:17