Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.09;
Скачать: CL | DM;

Вниз

Можно ли убрать свойство, кот. не нужно?   Найти похожие ветки 

 
tria ©   (2003-12-22 18:23) [0]

Есть компонент, кот. унаследовал от родителя свойства. Часть этих свойств не нужна. Можно ли их как-то убрать?
Или же сделать Read оnly?


 
Плохиш_   (2003-12-22 18:26) [1]

private, protected


 
Юрий Зотов ©   (2003-12-22 18:29) [2]

> Плохиш_ (22.12.03 18:26) [1]

И что?

> tria © (22.12.03 18:23)

Убрать СОВСЕМ - нельзя. Убрать из Object Inspector - можно (зарегистрировав nil-ный редактор). Поэтому, если есть custom-предок, то лучше наследуйтесь от него и сами публикуйте, что нужно.


 
tria ©   (2003-12-22 18:34) [3]

Спасибо за консультацию.


 
y-soft ©   (2003-12-22 21:27) [4]

Можно переопределить эти свойства в классе-потомке, чтобы при изменении значения ничего реально не делали


 
Юрий Зотов ©   (2003-12-23 02:21) [5]

> y-soft © (22.12.03 21:27) [4]

Насколько помню, свойства невиртуальны - а если так, то такой метод сработает не всегда.


 
y-soft ©   (2003-12-23 08:21) [6]

>Юрий Зотов © (23.12.03 02:21) [5]

Насколько помню, свойства невиртуальны

А это и не нужно - новое свойство перекроет одноименное старое, при всех обращениях (кроме, конечно, вызовов inherited из самого класса) будут вызываться методы именно нового свойства.

Способ, конечно, кривоватый и неэкономный, но иногда приходится использовать, чтобы не нарушать наследование :)


 
Юрий Зотов ©   (2003-12-23 13:35) [7]

> y-soft © (23.12.03 08:21) [6]

> А это и не нужно - новое свойство перекроет одноименное
> старое, при всех обращениях (кроме, конечно, вызовов inherited
> из самого класса) будут вызываться методы именно нового
> свойства.

К какому свойству произойдет обращение вот в этом весьма распространенном случае:

type
TAncestor = class(...)
...
property Prop: ...;
end;

TDescendant = class(TAncestor)
...
property Prop: ...;
end;

var
Obj: TAncestor;
...
Obj := TDescendant.Create(...);
... Obj.Prop... // Вот здесь


 
Тимохов ©   (2003-12-23 13:37) [8]

Граждане!
Не насилуйте и так не очень красивое ООП в Дельфи.
Если, что-то надо удалть в потомках - значит если ошибка архитекотра проекта.
ИМХО, конечно...


 
y-soft ©   (2003-12-23 14:29) [9]

>Юрий Зотов © (23.12.03 13:35) [7]

В Вашем примере естественно выдаст "Ancestor".
Но в следующем - и "Descendant" (желающие могут проверить),

TAncestor = class
private
function GetSomeProp: string;
public
property SomeProp : string
read GetSomeProp;
end;

TDescendant = class(TAncestor)
private
function GetSomeProp1: string;
public
property SomeProp : string
read GetSomeProp1;
end;

...

function TAncestor.GetSomeProp: string;
begin
Result := "Ancestor";
end;

function TDescendant.GetSomeProp1: string;
begin
Result := "Descendant";
end;

...
var
Obj : TAncestor;
begin
Obj := TDescendant.Create;
writeln(Obj.SomeProp);//Выдает строчку "Ancestor"
writeln((Obj as TDescendant).SomeProp);//Выдает строчку "Descendant"
Obj.Free;
Readln;
end;


Ну и о чем, кроме того, что идет обращение к методам разных классов, это говорит? Вы ведь явно в своем коде определяете Obj : TAncestor, значит услужливая Delphi и обращается к свойствам TAncestor, а методы не виртуальные. Я же говорил о любых обращениях к методам и свойствам именно нового класса, а не его предков...

Еще раз повторюсь: способ на крайний случай и требует аккуратности и понимания ООП в Delphi

P.S. Ничего личного



Страницы: 1 вся ветка

Текущий архив: 2004.01.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
4-25667
Gilk
2003-11-05 15:35
2004.01.09
Статус завершения работы с документом


1-25323
Андрю-ХА
2003-12-22 13:37
2004.01.09
OwnerDraw StatusBar


1-25434
Silver_
2003-12-23 17:35
2004.01.09
Почему Field.OnChange вызывается 2 раза подряд


6-25476
Anarki
2003-11-07 23:58
2004.01.09
Проблема с idSMTP


8-25449
malkolinge
2003-09-06 15:01
2004.01.09
Flasah