Наследование функции C # - использование дочерних классов с функцией базового класса - PullRequest
0 голосов
/ 30 ноября 2011

Добрый день, у меня довольно простой вопрос к опытным программистам C #. По сути, я хотел бы иметь абстрактный базовый класс, который содержит функцию, основанную на значениях дочерних классов. Я пробовал код, подобный следующему, но компилятор жалуется, что SomeVariable имеет значение null, когда SomeFunction () пытается его использовать.

Базовый класс:

public abstract class BaseClass
{
    protected virtual SomeType SomeVariable;

    public BaseClass()
    {
         this.SomeFunction();
    }

    protected void SomeFunction()
    {
         //DO SOMETHING WITH SomeVariable
    }
}

Детский класс:

public class ChildClass:BaseClass
{
    protected override SomeType SomeVariable=SomeValue;
}

Теперь я ожидаю, что когда я сделаю:

ChildClass CC=new ChildClass();

Необходимо создать новый экземпляр ChildClass, и CC запустит свою унаследованную SomeFunction с использованием SomeValue. Однако это не то, что происходит. Компилятор жалуется, что SomeVariable является нулевым в BaseClass. Возможно ли то, что я хочу сделать, даже в C #? Я использовал другие управляемые языки, которые позволяют мне делать такие вещи, поэтому я уверен, что я просто делаю здесь простую ошибку.

Любая помощь очень ценится, спасибо.

1 Ответ

1 голос
/ 30 ноября 2011

Вы поняли это почти правильно, но вам нужно использовать свойства вместо переменных:

public abstract class BaseClass {
    protected SomeType SomeProperty {get; set}
    public BaseClass() {
         // You cannot call this.SomeFunction() here: the property is not initialized yet
    }
    protected void SomeFunction() {
        //DO SOMETHING WITH SomeProperty
    }
}
public class ChildClass:BaseClass {
    public ChildClass() {
        SomeProperty=SomeValue;
    }
}

Вы не можете использовать FomeFunction в конструкторе, поскольку SomeProperty не был инициализирован производным классом. Снаружи конструктора все нормально. В общем, доступ к виртуальным членам в конструкторе следует рассматривать как подозрительный.

Если вы должны передать значения из производных классов в конструктор базового класса, лучше всего сделать это явно через параметры защищенного конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...