Заставить наследника инициализировать поле базы из его CTOR (C #) - PullRequest
2 голосов
/ 15 января 2010

Я пытаюсь заставить наследника абстрактного класса инициализировать одно из полей в базе.

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

Возможно, кто-то может подсказать, как это сделать, или, может быть,сделать так, чтобы мне вообще не нужно было это делать?

Это почти то, что я делаю:

public abstract class Base
{
    // Would like to force setting in CTOR
    protected BaseImplementation _implementation;  
    protected BaseImplementation Implementation 
    { get { return _implementation; } }

    public void DoSomething()
    {    
        Implementation.DoSomething();
    }
}

public abstract class BaseImplementation
{
    public abstract void DoSomething();
}

public class MyObject : Base
{
    // Note its Nested
    public class MyImplementation : BaseImplementation
    {
        private MyObject _myObject;

        public MyImplementation(MyObject myObject)
        {
            this._myObject = myObject;
        }

        public override void DoSomething()
        {
            // Does something
        }
        public virtual void SomethingElse()
        {
            // Does something else 
        }
    }

    new public MyImplementation Implementation
    {
        get { return (MyImplementation) _implementation; }
    }

    public void SomethingElse()
    {
        Implementation.SomethingElse();
    }
}

Чтобы дать небольшой контекст, у меня есть несколькоклассы, которые наследуются от базы.У стажера есть несколько способов, которыми они могут манипулировать своим состоянием.Это было лучшее решение, которое я придумал для обработки этого.

Edit

Я забыл упомянуть, что я не использую свойство Abstract, потому что это означает, что я не могу использовать new public MyImplementation Implementation {...,Я не хочу приводить реализацию к MyImplementation всякий раз, когда я использую функциональность, специфичную для производного класса (таким образом, используя new в первую очередь) , или создаю несколько полей, содержащих один и тот же объект.

1 Ответ

8 голосов
/ 15 января 2010

Не добавляйте поле в базовый класс. Просто сделайте это abstract свойством. Производные классы должны будут переопределить его и вернуть свое собственное значение.

protected abstract BaseImplementation Implementation { get; }

Или же вы можете заставить конструктор базового класса принимать аргумент типа BaseImplementation и инициализировать его производным классом:

public abstract class Base { 
    protected Base(BaseImplementation implementation) {
        _implementation = implementation; 
    }

    private BaseImplementation _implementation;  
    protected BaseImplementation Implementation { get { return _implementation; } }
}

public class Derived : Base {
    public Derived() : base(new MyImplementation()) { }
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...