Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1279193322
Aleks
2010-07-15 15:28
2010.10.10
Экспорт ListView в эксель


11-1224541718
Harlong
2008-10-21 02:28
2010.10.10
Размер KOLTabControl в WinCE


15-1278477726
ixen
2010-07-07 08:42
2010.10.10
Windows 7 64 бит и моё приложение


6-1226224895
DOjD
2008-11-09 13:01
2010.10.10
IdHTTP.Post


2-1279476319
lirikus
2010-07-18 22:05
2010.10.10
Фильтрация по дате





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский