Выполнить производный конструктор перед базовым конструктором в C # - PullRequest
13 голосов
/ 09 апреля 2009

Моя проблема в том, что я хотел бы передать объект в производный класс, но это нужно сделать до конструктора базового класса, поскольку базовый класс немедленно вызовет метод Start() производного класса, который использует объект.

Вот выдержка из базового класса (для удобства переименована в BarcodeScanner ).

public abstract class MyBase
{    
    public MyBase()
    {
        if (Initialize())
            this.Start();
    }

    public abstract bool Initialize();
    public abstract void Start();
}

Вот производный класс, который я создаю.

class MyDerived : MyBase
{
    private string sampleObject;

    public MyDerived (string initObject)
    {
        sampleObject = initObject;
    }

    public override bool Initialize() 
    { 
        return GetDevice();
    }
    public override void Start() 
    { 
        Console.WriteLine("Processing " + sampleObject.ToString()); 
    }
}

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

Я справился с этим, поместив блок Initialize / Start if внутри конструктора MyDerived. Тем не менее, существуют другие классы, производные от базового класса; поэтому мне пришлось повторить этот блок кода инициализации / запуска в каждом производном классе. Я хотел бы увидеть альтернативу модификации базового класса.

Ответы [ 3 ]

17 голосов
/ 09 апреля 2009

ИМХО, ваш дизайн не так. Вы не должны запускать процесс из конструктора. Ваш потребляющий код должен явно вызывать метод Start () при необходимости.

17 голосов
/ 09 апреля 2009

То, что вы пытаетесь сделать, невозможно в C #. Конструктор в базовом классе должен быть запущен до конструктора любого производного класса, в противном случае существует вероятность повреждения состояния объекта. Дочерний объект должен иметь возможность предполагать, что его база полностью построена и доступна.

1 голос
/ 09 апреля 2009

Я бы переделал ваш дизайн так, чтобы Initialize (и, возможно, Start () - хотя обычно это был бы публичный метод, вызываемый пользователем), вызывался после построения.

Если вы делаете BarcodeScanner, вы можете сделать это при первом запуске сканирования. Просто лениво инициализируйте своих членов, используя данные из производного класса.

Это обойдет вашу проблему, без каких-либо реальных изменений в использовании пользователем.

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