Наследование и Свойства
есть класс a1 у него есть свойство b
a1=class
property b:....способ доступа 1
.......
end
есть класс a2 и у него есть свойство b
a2=class(a1)
property b:....способ доступа 2
......
end
и так может быть много наследников как от a1, так и от a2, так и от них самих.
Мне надо обращаться к общим полям этих классов и их наследников, и я хочу это сделать через функцию.
Какой мне сделать тип функции, что бы оно обращалось к их общим полям правильно.
(Что проверку типов надо делать через "is" я знаю)
a1=class
property b:....способ доступа 1
.......
end
есть класс a2 и у него есть свойство b
a2=class(a1)
property b:....способ доступа 2
......
end
Так делать нельзя.
Перегрузки свойств в Делфи ещё не придумали.
Если хочешь сделать так, чтоб свойство b в классе a2 возвращало что-то другое - переопределяй методы доступа, т.е. в классе a1 надо их объявить в разделе protected как virtual методы.
Так делать нельзя.
Перегрузки свойств в Делфи ещё не придумали.
Если хочешь сделать так, чтоб свойство b в классе a2 возвращало что-то другое - переопределяй методы доступа, т.е. в классе a1 надо их объявить в разделе protected как virtual методы.
Но у меня то работает, кроме того возвращают они одно и то же, но первый обращается к внутреней переменной, а второй выберает значения методом
Но у меня то работает, кроме того возвращают они одно и то же, но первый обращается к внутреней переменной, а второй выберает значения методом
Ты просто перекрыл старое свойство новым - так делать не рекомендуется. А чтобы при обращении к свойству возвращались корректные, относящиеся к нужному классу, значения - нужны виртуальные методы доступа. Ты их и будешь переопределять в наследниках - в этом случе не будет перекрытия свойства (свойство нужно объявлять только 1 раз - в базовом классе, то бишь a1)
вот пример:
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;
Ты просто перекрыл старое свойство новым - так делать не рекомендуется. А чтобы при обращении к свойству возвращались корректные, относящиеся к нужному классу, значения - нужны виртуальные методы доступа. Ты их и будешь переопределять в наследниках - в этом случе не будет перекрытия свойства (свойство нужно объявлять только 1 раз - в базовом классе, то бишь a1)
вот пример:
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 и другие общие, но перекрытые, поля и методы работать правильно в этом случае?
А если мне во втором классе (a2) надо сделать свойство(b) только для чтения?
И всё равно, если я буду обращаться к a2 как к a1, будет ли b и другие общие, но перекрытые, поля и методы работать правильно в этом случае?
В делфи при обращении к свойству (чтение/запись) компилятор подставляет обращение к соотвтствущему методу. Если он виртуален - то как к виртуальному, со всеми вытекающими отсюда вещами.
А перекрутие свойств - дело неблагодарное и даже опасное. Вот напимер, внутри класса a1 идёт обращение в b, а в a2 ты перекрыл b, а те методы, которые были наследованы от a1 будут всё-равно обращаються к СТАРОМУ b, а не к новому. Так вота.
А если хатишь сделать тока для чтения, то оверрайди метод для записи так, чтоб он ничего не изменял и/или спаунил эксепшн - типа не могу записать в свойство.