2012-05-30 3 views
1

Допустит, у меня есть следующие классыСначала заданы свойства базового конструктора?

class animal 
{ 
    public string name; 
    public animal(string name) 
    { 
     this.name = name; 
    } 
} 

, а также

class dog : animal 
{ 
    public string breed; 
    public dog(string name, string breed): base(name) 
    { 
     this.breed = breed; 
    } 
} 

и, наконец,

class poodle : dog 
{ 
    public poodle(string name, string breed, int hairLength): base(name, breed) 
    { 
     //in here, name is = null for some reason. 
    } 
} 

Вопрос заключается в том, что, когда у меня есть трехуровневая иерархия наследования, базы Конструктор (animal), кажется, вызывается после конструктора poodle (имя == null). Но в конструкторе poodle я мог захотеть получить доступ к некоторым свойствам, которые были установлены в базовом конструкторе, и т. Д.

Кто-нибудь знает, как это можно сделать или, вопрос? (Только решение, которое я могу вспомнить, на самом деле не с помощью конструктора, а есть метод отдельной Initialize().

Спасибо!

+1

HTTP: //stackoverflow.com/questions/140490/base-constructor-in-c-sharp-which-gets-called-first –

+1

Erm, я просто базовый конструктор выполняет сначала. –

+0

@Steve, пожалуйста, покажите код, который не работает (и прокомментируйте способ, которым вы ожидаете его работы). До сих пор 'this.name' должно быть прекрасно внутри конструктора Dog (BTW, рассмотрите следующие правила кодирования C# при написании кода примера - т.е. классы должны начинаться с верхнего регистра, такого как Animal and Dog) –

ответ

2

Это простая проблема видимости. Так как вы не указали его явно, name поле является закрытым, поэтому он не может получить доступ к подклассами Вы могли сделать это protected вот так:.

protected string name; 

Это было бы самым простым решением, но лучше, чтобы использовать свойство:

protected string Name { get; set; } 

И просто используйте это вместо поля.

(Как правило, это считается лучшей практикой, чтобы не позволить полю избежать типа, в котором они были объявлены так, как только вы должны получить доступ к полю из-за пределы объявляющего типа, вы должны рассмотреть возможность использования свойств.).

+0

Извините, это не проблема, которую я пытался объяснить. Я обновил образец выше. Пока что скажем, что они публичные. Моя проблема заключается не столько в доступе к свойству, сколько в том, что я хочу, чтобы сначала был создан базовый конструктор, поэтому он может установить значение, а затем в конструкторе собаки я могу прочитать значение. – Steve

+3

@Steve, но это * точно * как это уже работает. Вызов 'base (name)' встречается * перед * остальной частью кода в вашем конструкторе. Вы получаете сообщение об ошибке?Почему вы думаете, что это не работает? –

+0

Извините, я только немного посмотрел на свой код и понял, что это происходит, когда у меня есть три уровня иерархии. Обновление вопроса, чтобы отразить это сейчас. – Steve