Главная страница
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.028 c
6-25485
Chips
2003-11-06 12:53
2004.01.09
чем скорость передачи по сети померять ?


14-25574
BlackTiger
2003-12-16 21:23
2004.01.09
ЛЮДИ!!! Помогите срочно с клавиатурой!


14-25501
SkyRanger
2003-12-08 04:02
2004.01.09
---|Ветка была без названия|---


11-25268
tamerlan311
2003-04-14 00:29
2004.01.09
Форум


3-25255
NewD
2003-12-10 13:06
2004.01.09
Как из события OnDrawColumnCell определить какая этострока