Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
3-74577
Pavel_S
2002-12-04 16:27
2002.12.23
ПОМОГИТЕ С ЗАПРОСОМ !!!


3-74565
Shaman
2002-12-03 17:21
2002.12.23
Значение поля кот. было до обновления в триггере FOR UPDATE


1-74664
Raph
2002-12-12 16:28
2002.12.23
Встроенный асм


1-74764
Иванов Сергей
2002-12-10 20:24
2002.12.23
как заставить D5 сохранять изменения в *.dfm


14-74888
vajo
2002-12-02 10:15
2002.12.23
Сеть





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский