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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2012, 17:28   #1
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию Разбор полетов - классы

Код:
unit person;
interface
uses SysUtils, Dialogs, Classes, DateUtils;
type
TPerson = class
private

FName: string;  //
FDepl, FDep2, FDep3: string;     //
FYear: word;	//
FSex: char;	//
FAttr: boolean;	//
FComment: string;	//
constructor Create;
protected
procedure SetYear(value:word);
procedure SetSex(Value: char);  //
public
constructor create;
property Name: string read FName write FName;
property Depl: string read FDepl write FDepl;
property Dep2: string read FDep2 write FDep2;
property Dep3: string read FDep3 write FDep3;
property Year: word read FYear write SetYear;
property Sex: char read FSex write SetSex default 'М';
property Attr: boolean read FAttr write FAttr default true;
property Comment: string read FComment write FComment;
  end;

implementation
constructor Tperson.Create;
const Unknown = 'Неизвестный';
begin
inherited;
Fsex:= #0;
AgeMax:=150;
Fname:=Unknown;
Fdep1:=Unknown;
Fdep2:=Unknown;
Fdep3:=Unknown;
end;
procedure TPerson.SetSex(Value: char);
begin
if Value in ['М', 'Ж']
then FSex := Value
else ShowMessage('неправильный символ "' + Value +
'" в указании пола');
end;
procedure Tperson.SetYear(value:word);
var
NowYear:=word;
begin
nowYear:=YearOf(date);
if (nowYear - value >= agemin) and (nowYear -value <= AgeMax) then
then FYear:=Value else showmessage('Недопустимый год рождения' + inttostr(value));
end;
end.
Прошу сильно не карать, все как то обходился без классов, а сейчас возникла потребность разобраться, открыл статейку в интернете и пытался разобраться...
Не компилируется, ругает на конструктор класса и просит override
Пытался добавить не помогло чего то.
Переопределять необходимо любой замещаемый метод родительского класса?
Как лучше хранить классы? Можно ли использовать классы других языков.
Помогите разобраться пожалуйста
alekola вне форума Ответить с цитированием
Старый 09.06.2012, 19:24   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Не компилируется, ругает на конструктор класса и просит override
вообще-то он просит overload; (не override)!

У вас дважды объявлено одинаковое имя конструктора.
Цитата:
Код:
FAttr: boolean;	//
FComment: string;	//
                    constructor Create;
protected
procedure SetYear(value:word);
procedure SetSex(Value: char);  //
public
                    constructor create;
Смещено для наглядности!
Для разрешения одинаковых имен используется ключевое слово overload; вот его он и просит!
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 09.06.2012, 19:26   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
private
constructor Create;
...
public
constructor create;
первый явно лишний.


Код:
property Sex: char read FSex write SetSex default 'М';
property Attr: boolean read FAttr write FAttr default true;
default имеет смысл указывать только для published свойст. И если уже указали какое-то значение в default, ваша обязанность это значение в конструкторе присвоить.


Цитата:
Переопределять необходимо любой замещаемый метод родительского класса?
переопределение (override) необходимо только тогда, когда методы, процедуры или функции с одинаковыми именами (но с разными параметрами) оказываются в одной области видимости (namespace).

перекрытие (overload) необходимо только для тех методов, которые были объявлены как virtual или dynamic выше по дереву классов.


Цитата:
Как лучше хранить классы?
смотря где. В памяти они и сами по себе неплохо хранятся, в файле обычно используется сериализация.


Цитата:
Можно ли использовать классы других языков.
только через COM
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.06.2012, 23:30   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

А где деструктор? Здесь как бы необязателен, но как только появятся чужие экземпляры или начнете объявлять динамические массивы - не забудьте про деструктор. Когда писал на Дельфи в любом классе, даже примитивном всегда имелся деструктор - помогает от утечек памяти и непонятных вылетов программы
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.06.2012, 10:18   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
переопределение (override) необходимо только тогда, когда методы, процедуры или функции с одинаковыми именами (но с разными параметрами) оказываются в одной области видимости (namespace).

перекрытие (overload) необходимо только для тех методов, которые были объявлены как virtual или dynamic выше по дереву классов.
с точностью до наоборот.
overload - для одинаковых имен в одном модуле.
override - для изменения виртуальных (динамических) у наследника.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 11.06.2012, 06:00   #6
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

Спасибо всем за ответы.
alekola вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разбор полетов, или invalid convert madmaniac Visual C++ 2 02.05.2011 11:47
разбор числа СИ Яська Помощь студентам 1 02.04.2011 01:53
разбор пути m_kostik Win Api 3 01.04.2010 22:25
Разбор полетов по DevExpress Quantum DBGrid Killer_djon БД в Delphi 2 18.11.2007 14:45