Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2014, 13:37   #1
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
Вопрос ООП: доступ к полям наследника через предка

Доброго времени суток!
Вот встретил на своем пути следующую "проблемку"...
Есть предок:
Код:
type TFather = class
  private
    fFatherField:Integer;
  public
    property FatherField:Integer read fFatherField write fFatherField;
    constructor Create;
end;
И есть на следник:
Код:
type TSon = class(TFather)
   private
     fSonField:Integer;
   public
    property SonField:Integer read fSonField write fSonField;
    constructor Create;
end;
А когда пишу реализацию в программе, FatheOrSon объявляю через класс TFather. Делаю это лишь для того, что знать какой класс использую лиш во время выполнения программы...
Код:
procedure test(const father:boolean; const value:integer);
var FatheOrSon:TFather;
begin
  if father then begin
    FatherOrSon:=TFaher.Create; FatherOrSon.FatherFiel:=value;
  end else begin
    FatherOrSon:=TSon.Create;
    //а вот здесь обратится к полю SonField нельзя FatherOrSon.SonField:=value;
    //Можно лиш так
    TSon(FatherOrSon).SonField:=value;
  end;
Вопрос: Можноли как-то избежать привидения типов TSon(FatherOrSon) для доступа к полям наследника.
P.S Здесь я демонстрирую листинг придуманных классов, они являються лишь для объяснения на примере чего я хочу достич.
end;
Khayzenberg вне форума Ответить с цитированием
Старый 04.04.2014, 13:45   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Зачем так все замучено. Дайте пример, где это нужно.
Если все так плохо (при условии, что я понял правильно), сделайте специальное поле-идентификатор, которое бы переопределялось в наследнике. Читая его, можно будет уже определить кто есть кто. Но опять же нафига это нужно?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 04.04.2014 в 13:47.
Utkin вне форума Ответить с цитированием
Старый 04.04.2014, 13:48   #3
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

можно ли человека называть колей?
end;
eval вне форума Ответить с цитированием
Старый 04.04.2014, 13:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

нет нельзя, у вас разные класс, и у предка нет ничего от потомка кроме связи.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.04.2014, 13:56   #5
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
Сообщение

Благодярю вас! Я понял переменная объявлена через предка никак не может узнать свойства, поля наследника... Спасибо!

Последний раз редактировалось Khayzenberg; 04.04.2014 в 13:59.
Khayzenberg вне форума Ответить с цитированием
Старый 04.04.2014, 13:58   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

что за портянка?
eval вне форума Ответить с цитированием
Старый 04.04.2014, 14:06   #7
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
По умолчанию

Смотри...
Код:
procedure test;
var son:TFather;
begin
  son:=TSon.Create;
  //так делать нельзя >>> son.SonField:=97, так как TFather незнает свойства SonField
  //можно только так
  TSon(son).SonField:=97;
  FreeAndNil(son);
end;
Khayzenberg вне форума Ответить с цитированием
Старый 04.04.2014, 14:11   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

гоуту #3
eval вне форума Ответить с цитированием
Старый 04.04.2014, 14:18   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
var son:TFather;
begin
son:=TSon.Create;
//так делать нельзя >>> son.SonField:=97, так как TFather незнает свойства SonField
//можно только так
TSon(son).SonField:=97;
Чет я не понял...
У тебя есть son:TFather, в котором нет некоего поля. Но приведением типов TSon(son) ты это поле каким-то образом всетки получаешь?
Т.е. У твоего отца есть жена, если тебя назвать отцом, значит у тебя автоматически появляется жена, являющаяся твоей матерью. Так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.04.2014, 14:24   #10
Khayzenberg
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 54
Вопрос

Цитата:
Сообщение от eval Посмотреть сообщение
можно ли человека называть колей?
end;
Такую операцию делать можна, но только в том случае если создаем только потомка например:
Цитата:
Сообщение от Khayzenberg Посмотреть сообщение
Смотри...
Код:
procedure test;
var son:TFather;
begin
  son:=TSon.Create;
  //так делать нельзя >>> son.SonField:=97, так как TFather незнает свойства SonField
  //можно только так
  TSon(son).SonField:=97;
  FreeAndNil(son);
end;
А вот так делать нельзя:
Код:
procedure test;
var obj:TWinConstrol;
begin
  obj:=TGraphicControl.Create;
end;
Может я не прав?
Khayzenberg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к полям класса -спискам zl@dey Общие вопросы C/C++ 1 31.03.2012 04:06
доступ к полям GridView Алек Помощь студентам 0 23.12.2011 16:03
Доступ к БД через Internet yulia Работа с сетью в Delphi 3 04.03.2009 00:44
Доступ к полям компонента TTable с большими целыми числами AleksP Общие вопросы Delphi 6 13.10.2008 18:41