Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизInterface(Сложный вопрос) Найти похожие ветки
← →
malkolinge (2002-12-11 16:15) [0]Прошу помощи у мастеров и всех остальных :
Ситуация Имеем интерфейс :
type
ImyInt=Interface
procedure GetParam(name:string);overload;
procedure GetParam(Index:integer);overload;
end;
Имеем клас
TmyClass=Class(TComponent,ImyInt)
procedure GetParameter(name:string);overload;
procedure GetParameter(Index:integer);overload;
end;
Как заставить TmyClass Реализовать интерфейс ? Имен менять нельзя. Способ создать две одноименных процедуры в классе, через которые вызывать GetParameter пожайлуста не советовать..
С уважением Евгений
← →
Digitman (2002-12-11 16:25) [1]вообще-то не очень понятно, почему префиксом Get снабжена процедура, а не функция ... Get - это все же "получить", а у тебя в процедуре не предусмотрены параметры для возврата результата
но это так, к слову)
почему бы тебе не объявить так
procedure GetParam(Value:OleVariant)
?
вариантный тип форм.параметра позволит передавать и обрабатывать практически любые возможные типы факт.параметров ! И никаких overload)
procedure TmyClass.GetParam(Value:OleVariant);
begin
case TVarData(Value).VType of
varEmpty: ....
varNull: ....
varInteger: ...
varString: ...
else
...
end;
end;
← →
malkolinge (2002-12-11 16:36) [2]На самом деле этот пример я выдумал из башки. Интерфейс где мне это понадобилось слишком большой. К сожалению мне надо именно оверлоад. Еще варианты есть ?
← →
Digitman (2002-12-11 16:41) [3]а почему именно overload ? чем это обосновано ?
заметь - все OLE-серверы, обязательно предоставляющие и реализующие некие интерфейсы, используют именно этот метод передачи параметров/возврата результатов.
← →
VaS (2002-12-11 16:52) [4]Ну без оверлоада вот так:
TMyClass = Class(TComponent, IMyInt)
public
procedure GetParameter(index: integer);overload;
procedure IMyInt.GetParam = GetParameter;
end;
А с оверлоадом похоже никак.
← →
Fantasist (2002-12-12 07:55) [5]
> обязательно предоставляющие и реализующие некие интерфейсы,
> используют именно этот метод передачи параметров/возврата
> результатов
Ну, не только его.
Вообще-то интерфейс не предпологает overloading, так как для него нужна декорация имен в зависимости от аргументов, а это дело компилятора. В том смысле, что интерфейсы-то(Delphi-ские interface) были придуманны чтобы соответсвовать COM, и, естессвенно, так как IDL интерфейса не может допускать описание одноименных методов, то чтобы не вносить путаницы, и для Delphi"иский интерфейсов было бы логично придерживаться того же правила. Вообще, с этой точки зрения, overloading в интерфейсе не должен был бы компилироваться. С другой стороны, раз такая возможность есть, то тот факт, что не существует поддержки разрешения имен в таком случае, говорит, скорее, о недосмотре разработчиков. Хотя мне определенно не понятно - перегрузка вещь, конечно, удобная, но можно обойтись и без нее.
← →
malkolinge (2002-12-12 15:28) [6]Все дело в том, что есть группа классов. Уже сделанных и внедренных. Теперь вот возникла необходимость более-менее это дело стандартизовать(что ли). Все эти функции в каждом из классов есть, они перегруженные. Но называються по-разному. Опять напоминаю, что это все дело спроэетировано давно и внедрено. А кроме этого есть компоненты, которые работаю с одним из этих классов. Хочеться сделать их универсальными, а также не вносить кучу изменений в реализацию компонент. Поэтому и возникла необходимость в интерфейсах. И нужна перегрузка.. Хотя по всей видимости - это не реально :(
← →
Бурундук (2002-12-12 15:41) [7]Вот такой вариант не подойдёт?
IMy = interface
["{23CA0400-0DE6-11D7-9EF7-0050BAF21D9F}"]
procedure A(I: Integer);
procedure B(s: PChar);
end;
// В интерфейсе назвать процедуры разными именами,
// а классы не трогать
TMy = class(..., IMy)
procedure AA(I: Integer); overload;
procedure AA(s: PChar); overload;
procedure IMy.A = AA; // выберет нужную по сигнатуре
procedure IMy.B = AA;
end;
Только что проверил, работает.
Как это ни странно...
← →
vuk (2002-12-12 15:50) [8]В принципе можно пойти немного другим путем. Для этого функции типа этих:
procedure GetParam(name:string);
procedure GetParam(Index:integer);
можно растащить по разным интерфейсам, а не собирать в одном. тогда в классе можно будет использовать разрешение имен.
Например так(я заменил GetParam на SetParam ):
IA = interface
["{22B32775-D5E6-4FDB-A8D6-61D3E56CE09A}"]
procedure SetParam( S : string );
end;
IB = interface
["{507F1046-C935-49E6-ADD5-FEE539B8D46F}"]
procedure SetParam( i : integer );
end;
TSomeClass = class(TInterfacedObject, IA, IB)
procedure SetParameter( S : string ); overload;
procedure SetParameter( i : integer ); overload;
procedure IA.SetParam = SetParameter;
procedure IB.SetParam = SetParameter;
end;
P.S.: Насколько я понял, в Delphi.NET нужная Вам перегрузка будет возможна (см. раздел Interface method resolution в статье http://bdn.borland.com/article/0,1410,28972,00.html ). Пока же, увы, это нереально... Придется расхлебывать недостатки не очень хороших проектных решений.
← →
malkolinge (2002-12-12 18:49) [9]Ладно всем спасибо ! Мы пошли другим путем :)))))
← →
vuk (2002-12-12 19:44) [10]Каким, если не секрет?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c