Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизМожно ли убрать свойство, кот. не нужно? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c