Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.02 c
6-25473
BlackSun
2003-11-07 05:55
2004.01.09
Работа с сокетами и вылет проги


3-25251
x_x_x
2003-12-10 12:42
2004.01.09
TAdoCommand и параметры


8-25447
TGrey
2003-09-06 22:40
2004.01.09
Как определить координаты области вокруг линии


8-25446
gunner
2003-09-03 14:20
2004.01.09
Преобразовать Graphic в BitMap


6-25469
lkj
2003-11-07 13:45
2004.01.09
Кодинг сокетов юзая winsock в Дэлфи




   Наверх