Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
ВнизОграничение доступных свойств и методов объекта Найти похожие ветки
← →
PinDOS (2010-07-17 19:15) [0]Здравствуйте уважаемые мастера!
Пускай есть некий классTClass1
, одна из егоprivate переменных - ссылкаPObj1
на объект другого классаTSubClass1
, мне надо сделать эту переменную частично доступной, но если поместить ее в раздел public или создатьproperty
которое будет возвращать адресTSubClass1
, то появиться возможность извне вызватьPObj1.Destroy
или иные методы (определяемые мною), которые должны быть доступны только для объекта типаTClass1
Спасибо!
← →
Германн © (2010-07-17 19:19) [1]
> мне надо сделать эту переменную частично доступной
Что это значит?
← →
PinDOS (2010-07-17 19:35) [2]
> ?UnitX
uses
...
TSubClass1 = class(...)
public
...
property Prop1: Byte read GetProp1 write GetProp1;
property Prop2: Byte read GetProp2 write GetProp2;
...
function func1(Arg: Byte): Boolean;
function func2(Arg: Byte): Boolean;
...
end;
TClass1 = class(...)
public // если здесь написать private то Var1 вообще не будет доступна извне
...
Var1: TSubClass1;
...
end;
...
end.
//---------------------------
Unit1
uses
...
var
X: TClass1;
implementation
...
procedure WTF;
begin
X.Var1.Prop1 := 12; // нужно что-бы здесь компилятор выдал что нету такого свойства
X.Var1.Prop2 := 0; // а такое есть
X.Var1.func1(1); // эта функции должна быть доступна
X.Var1.func2(72); // а этой функции "нету"
end;
...
end.
← →
Демо © (2010-07-17 19:50) [3]FMethod1 доступен только в InvisibleMethod в TClass1.
FMethod2 доступен только в VisibleMethod в TClass1.
В чём проблема?TSubclass=class
public
procedure FMethod1;
procedure FMethod2;
end;
TClass1=class
private
FSub: TSubclass;
procedure InvisibleMethod;
public
procedure VisibleMethod;
end;
procedure TClass1.InvisibleMethod;
begin
FSub.FMethod1;
end;
procedure TClass1.VisibleMethod;
begin
FSub.FMethod2;
end;
← →
Демо © (2010-07-17 19:51) [4]FMethod1 доступен только внутри класса, в отличие от FMethod2.
← →
Юрий Зотов © (2010-07-17 19:59) [5]Можно и еще проще:
TSubClass1 = class(...)
protected // или private
function func2(Arg: Byte): Boolean;
property Prop1: Byte read GetProp1 write SetProp1;
public
function func1(Arg: Byte): Boolean;
property Prop2: Byte read GetProp2 write SetProp2;
end;
← →
PinDOS (2010-07-17 19:59) [6]а как сделать без объявления доп. методов, что бы можно было просто вызвать
Var1.FSub.FMethod1
но нельзя былоVar1.FSub.FMethod2
читал что-то про интерфейсные типы (... = interface(...)
), их можно как нибудь для этой цели использовать?
← →
PinDOS (2010-07-17 20:01) [7]
> Юрий Зотов
мне нужно чтобы при отдельном использовании TSubClass1 были доступны все методы
например
var X: TSubClass1;
...
X.Prop1 := 0;//должно работать
X.Prop2 := 0;//и это тоже
...
← →
Юрий Зотов © (2010-07-17 20:09) [8]> PinDOS (17.07.10 20:01) [7]
TSubClass1 = class(...)
protected
function func2(Arg: Byte): Boolean;
property Prop1: Byte read GetProp1 write SetProp1;
public
function func1(Arg: Byte): Boolean;
property Prop2: Byte read GetProp2 write SetProp2;
end;
TSubClass2 = class(TSubClass1)
public
function func3(Arg: Byte): Boolean;
property Prop1;
end;
function TSubClass2.func3(Arg: Byte): Boolean;
begin
Result := func2(Arg);
end;
Для отдельного использования создаем TSubClass2 вместо TSubClass1 и юзаем func3 вместо func2. Свойство Prop1 тоже будет доступно.
← →
Юрий Зотов © (2010-07-17 20:16) [9]> PinDOS (17.07.10 20:01) [7]
Либо так - чтобы секцию protected сделать доступной, можно использовать такой прием:
var
SubClass1: TSubClass1;
type
TSubClass2 = class(TSubClass1);
---
SubClass1 := TSubClass1.Create;
with TSubClass2(SubClass1) do
begin // Здесь секция Protected доступна
Prop1 := 10;
Func2(20);
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c