Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Наследование и Свойства

286
25 января 2006 года
misha_turist
572 / / 28.11.2005
Вобщем такой вопрос:
есть класс a1 у него есть свойство b
a1=class
property b:....способ доступа 1
.......
end

есть класс a2 и у него есть свойство b
a2=class(a1)
property b:....способ доступа 2
......
end

и так может быть много наследников как от a1, так и от a2, так и от них самих.
Мне надо обращаться к общим полям этих классов и их наследников, и я хочу это сделать через функцию.

Какой мне сделать тип функции, что бы оно обращалось к их общим полям правильно.
(Что проверку типов надо делать через "is" я знаю)
5
25 января 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by misha_turist

a1=class
property b:....способ доступа 1
.......
end

есть класс a2 и у него есть свойство b
a2=class(a1)
property b:....способ доступа 2
......
end


Так делать нельзя.
Перегрузки свойств в Делфи ещё не придумали.
Если хочешь сделать так, чтоб свойство b в классе a2 возвращало что-то другое - переопределяй методы доступа, т.е. в классе a1 надо их объявить в разделе protected как virtual методы.

286
25 января 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by hardcase
Так делать нельзя.
Перегрузки свойств в Делфи ещё не придумали.
Если хочешь сделать так, чтоб свойство b в классе a2 возвращало что-то другое - переопределяй методы доступа, т.е. в классе a1 надо их объявить в разделе protected как virtual методы.



Но у меня то работает, кроме того возвращают они одно и то же, но первый обращается к внутреней переменной, а второй выберает значения методом

5
25 января 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by misha_turist
Но у меня то работает, кроме того возвращают они одно и то же, но первый обращается к внутреней переменной, а второй выберает значения методом

Ты просто перекрыл старое свойство новым - так делать не рекомендуется. А чтобы при обращении к свойству возвращались корректные, относящиеся к нужному классу, значения - нужны виртуальные методы доступа. Ты их и будешь переопределять в наследниках - в этом случе не будет перекрытия свойства (свойство нужно объявлять только 1 раз - в базовом классе, то бишь a1)

вот пример:

Код:
a1= class
protected
  function GetValue: TType; virtual;
  procedure SetValue(NewVal: TType); virtual;
public
  property B: TType read GetValue write SetValue;
end;

a2 = class(a1)
protected
  fucntion GetValue: TType; override;
  procedure SetValue(NewVal: TType); override;
end;
286
26 января 2006 года
misha_turist
572 / / 28.11.2005
Цитата:
Originally posted by hardcase
Ты просто перекрыл старое свойство новым - так делать не рекомендуется. А чтобы при обращении к свойству возвращались корректные, относящиеся к нужному классу, значения - нужны виртуальные методы доступа. Ты их и будешь переопределять в наследниках - в этом случе не будет перекрытия свойства (свойство нужно объявлять только 1 раз - в базовом классе, то бишь a1)

вот пример:
Код:
a1= class
protected
  function GetValue: TType; virtual;
  procedure SetValue(NewVal: TType); virtual;
public
  property B: TType read GetValue write SetValue;
end;

a2 = class(a1)
protected
  fucntion GetValue: TType; override;
  procedure SetValue(NewVal: TType); override;
end;




А если мне во втором классе (a2) надо сделать свойство(b) только для чтения?
И всё равно, если я буду обращаться к a2 как к a1, будет ли b и другие общие, но перекрытые, поля и методы работать правильно в этом случае?

5
26 января 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by misha_turist
А если мне во втором классе (a2) надо сделать свойство(b) только для чтения?
И всё равно, если я буду обращаться к a2 как к a1, будет ли b и другие общие, но перекрытые, поля и методы работать правильно в этом случае?

В делфи при обращении к свойству (чтение/запись) компилятор подставляет обращение к соотвтствущему методу. Если он виртуален - то как к виртуальному, со всеми вытекающими отсюда вещами.
А перекрутие свойств - дело неблагодарное и даже опасное. Вот напимер, внутри класса a1 идёт обращение в b, а в a2 ты перекрыл b, а те методы, которые были наследованы от a1 будут всё-равно обращаються к СТАРОМУ b, а не к новому. Так вота.

А если хатишь сделать тока для чтения, то оверрайди метод для записи так, чтоб он ничего не изменял и/или спаунил эксепшн - типа не могу записать в свойство.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог