Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ограничение доступных свойств и методов объекта


PinDOS ©   (2010-07-17 19:15:00) 

Здравствуйте уважаемые мастера!

Пускай есть некий класс TClass1, одна из его privateпеременных - ссылка PObj1на объект другого класса TSubClass1, мне надо сделать эту переменную частично доступной, но если поместить ее в раздел publicили создать propertyкоторое будет возвращать адрес TSubClass1, то появиться возможность извне вызвать PObj1.Destroyили иные методы (определяемые мною), которые должны быть доступны только для объекта типа TClass1

Спасибо!


Юрий Зотов   (2010-07-17 20:16:00) [1]

> 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;


Юрий Зотов   (2010-07-17 20:09:00) [2]

> 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 тоже будет доступно.


PinDOS   (2010-07-17 20:01:00) [3]


> Юрий Зотов

мне нужно чтобы при отдельном использовании TSubClass1 были доступны все методы

например

var X: TSubClass1;

...

X.Prop1 := 0;//должно работать
X.Prop2 := 0;//и это тоже
...


Юрий Зотов   (2010-07-17 19:59:00) [4]

Можно и еще проще:

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:00) [5]

а как сделать без объявления доп. методов, что бы можно было просто вызвать
Var1.FSub.FMethod1
но нельзя было
Var1.FSub.FMethod2

читал что-то про интерфейсные типы ( ... = interface(...)), их можно как нибудь для этой цели использовать?


Демо   (2010-07-17 19:51:00) [6]

FMethod1 доступен только внутри класса, в отличие от FMethod2.


Демо   (2010-07-17 19:50:00) [7]

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;


PinDOS   (2010-07-17 19:35:00) [8]


> ?

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:19:00) [9]


> мне надо сделать эту переменную частично доступной

Что это значит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо