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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2017, 14:44   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Классы. "Наследование" значений свойств.

Здравствуйте.
Никак не могу найти и понять как можно от родительского класса передать дочернему все значения его свойств.
Например, есть класс
Код:
TPrintProduct = class
public
  Type, Format: string;
end;
И есть дочерние классы:
Код:
TBook = class(TPrintProduct)
public
  Autor: string;
end;
TJournal = class(TPrintProduct)
public
  periodic: integer;
end;
Я, допустим, создаю класс TPrintProduct
Код:
PrintBook := TPrintProduct.Create;
PrintBook.Type := 'Книга';
PrintBook.Format := 'A5';
А потом создаю TBook.
Код:
Book1 := TBook.Create;
Как мне в Book1 поместить все имеющиеся значения уже созданного PrintBook? Есть что-то лаконичное, или нет ничего кроме того, чтоб просто приравнивать все соответствующие поля?
Ship_1 вне форума Ответить с цитированием
Старый 05.04.2017, 14:56   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Никак. Зачем вообще создавать экземпляр TPrintProduct? В других языках такие классы обычно даже помечают как "абстрактные", чтоб нельзя было создать их экземпляр.

А для инициализации обычно используют конструктор. В конструкторе можно вызвать родительский конструктор.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.04.2017, 14:59   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Я, допустим, создаю класс TPrintProduct
Нет, это создание экземпляра класса.

Наследуется не экземпляр класса, а класс.

И Type и Format ни капли не свойства, а просто public-поля
Цитата:
В других языках такие классы обычно даже помечают как "абстрактные"
В делфи тоже, сделать любой метод абстрактным - получишь абстрактный класс
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.04.2017 в 15:02.
Аватар вне форума Ответить с цитированием
Старый 05.04.2017, 15:10   #4
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Зачем вообще создавать экземпляр TPrintProduct?
Например, если в родительском классе не 2, а гораздо больше полей, и если много различающихся дочерних классов, чтоб при вновь созданном каждом из них не переприсваивать уже имеющиеся значения. Родительский конструктор ведь тоже не переносит значения.
Наверное, придётся создавать свой "конструктрор", с параметром - экземпляром родительского класса, в котором присваивать значения экземпляра "родителя"...
Ship_1 вне форума Ответить с цитированием
Старый 05.04.2017, 15:25   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ни чем экземпляр родительского класса не поможет, он вообще не нужен
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.04.2017, 15:26   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

родительский класс разлинованная ВЕРХНЯЯ половинка листа
дочерний класс Целый разлинованный лист (он включает в себя ту самую верхнюю половинку)

(разлинованная == перечислены свойства названия + значения)

Если мы берем половинку листа (создаем объект родительского типа) у нас есть только что написано на этой половинке. И писать мы можем только на ЭТОЙ половине.

Если бы берем СРАЗУ целый лист (создаем объект ДОЧЕРНЕГО типа) Мы можем писать на ВСЕМ листе.
При этом если согнем лист пополам то "увидим" только ВЕРХНЮЮ половинку (и читать/писать сможем только то что относится к РОДИТЕЛЬСКОМУ классу).
Использование свойств РОДИТЕЛЬСКОГО класса.
Но вторая половинка никуда не делась, и мы можем лист развернуть. Вернуться к полному набору свойств.

При половине листа (объект родительского класса) у нас ФИЗИЧЕСКИ нет второй половины и разворачивать нам НЕЧЕГО.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.04.2017 в 15:30.
evg_m на форуме Ответить с цитированием
Старый 05.04.2017, 15:26   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что куда не переносит?

И чем поможет еще один экземпляр?) Все равно ж ему придется присвоить значения. Тогда проще сделать конструкторы устанавливающие эти значения по умолчанию.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.04.2017, 15:30   #8
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что куда не переносит?
Родительский конструктор родительские значения в дочерний класс
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Тогда проще сделать конструкторы устанавливающие эти значения по умолчанию.
Ну вот это я и имел ввиду в конце.
Ship_1 вне форума Ответить с цитированием
Старый 05.04.2017, 15:42   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не это.

Код:

TPrintProduct = class
public
  Format: string;

  constructor Create(AFormat: string);
end;

TBook = class(TPrintProduct)
public
  Author: string;

  constructor CreateA5Book(AAuthor: string);
end;
Код:
constructor TPrintProduct.Create(AFormat: string);
begin
  Format := AFormat;
end;

constructor TBook.CreateA5Book(AAuthor: string);
begin
  inherited Create('A5');
  Author := AAuthor;
end;
Или для каких-то случаев просто
Код:
constructor Create(AAuthor: string; AFormat: string = 'A5');
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 05.04.2017 в 15:46.
Alex11223 вне форума Ответить с цитированием
Старый 05.04.2017, 16:15   #10
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Вот тут я уже ничего не понял... Откуда взялись эти "А"? AFormat, AAutor... Вот тут ещё нашёл похожее, только там вместо "А" непонятные "F"
Ship_1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
[C#]: Не могу понять, как создать иерархию классов "Печатное издание–Книга– Учебник–Журнал". Классы должны содержать поля для описания свойств объектов и методы для работы с ними sadness130 Помощь студентам 0 05.03.2017 13:10
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" link90 Общие вопросы C/C++ 2 27.03.2016 12:34
Для заданной строки определить все входящие в неё символ. Например: строка "abccbbabbac" состоит из символов "a", "b" и "c" Sandakan01 Помощь студентам 1 24.02.2016 03:20