2017-01-23 2 views
0

Когда я пишу класс я знаю, что я могу использовать inherted ключевое слово, чтобы я мог наследовать поведение или TObject, такие как:Delphi подклассы наследования

type 
TOperation = class(TObject) 
    constructor Create(dest, r1, r2: integer); 
end; 

и конструктор будет иметь inherited Create;. Посмотрите на следующий класс:

type 
TAddition = class(TOperation) 
    constructor Create(a1, a2: integer); 
end; 

Если первая линия TAddition является inherited Create; это означает, что я наследуя поведение TOperation конечно. Но означает ли это, что я также наследую поведение TObject? (который является суперклассом Операции).

Когда я наследую от конструктора отцовского класса (смотрите на TAddition), я наследую только поведение, не так ли? Я ничего от отца класса

Полный код не инициализируется здесь:

TOperation = class(TOBject) 
    private 
    dest, v1, v2: integer; 
    public 
    constructor Create(dest, r1, r2: integer); 
    property destination: integer read dest; 
    property value1: integer read v1; 
    property value2: integer read v2; 
end; 

TMemoria = class(TOperation) 
    private 
    dest, r1: integer; 
    public 
    constructor Create(dest, r1: integer); 
    property destination: integer read dest; 
    property register1: integer read r1; 
end; 

constructor TOperation.Create(dest, r1, r2: integer); 
begin 

    //inherit from TObject 
    inherited Create; 
    Self.r1 := r1; 
    Self.r2 := r2; //so on... 

end; 

constructor TMemoria.Create(dest, r1: integer); 
begin 

    //inherit from TObject OR inherit from TOperation? 
    inherited Create; 

end; 
+2

Вы должны быть намного яснее. В вас lr outline вы наследуете некоторый бит поведения не все. Вы обойдете родительский конструктор и перейдете непосредственно к конструктору TObject. Описание кода приводит к путанице. Покажи это. Мекве. –

+0

Да, пожалуйста, добавьте реализацию ваших создателей –

+0

Я добавил сценарий. Мой вопрос в основном, если подкласс в наследовании от TObject или от класса отца –

ответ

8
constructor TMemoria.Create(dest, r1: integer); 
begin 
    inherited Create; 
end; 

Это вызывает конструктор без параметров в TObject и не вызвать конструктор, объявленный в немедленном предка. Это должно быть ясно, потому что не заданы параметры.

Для получения подробной информации смотрите документацию: http://docwiki.embarcadero.com/RADStudio/en/Methods_(Delphi)#Inherited

как сильный руководящий принцип вы не должны пропустить вызова, унаследованных от конструкторов родительских классов. Часто это означает, что вы не создаете экземпляр объекта, который используется родительским классом. Я считаю код в вопросе очень подозрительным.

+0

Хорошо, это то, что мне нужно было знать; даже если TMemoria - это подкласс, который он наследует от создания TObject. Без создания Что происходит? –

+0

Ну, это зависит от того, кого вы называете. И если вы определили безразмерный конструктор в непосредственном предке, тогда он будет вызван. –

+0

Хорошо, если бы у TOperation был конструктор с именем Create, TMemoria назвал бы конструктор TOperation (а не конструктор TObject)? –