Mój problem polega na tym, że chciałbym przekazać obiekt do klasy pochodnej, ale musi to zostać wykonane przed konstruktorem klasy podstawowej, ponieważ klasa bazowa natychmiast wywoła wyprowadzenie metoda klasy Start()
, która używa obiektu.Wykonanie konstruktora pochodnego przed konstruktorem bazowym w C#
Oto fragment z klasy bazowej (zmieniono nazwę z BarcodeScanner dla wygody).
public abstract class MyBase
{
public MyBase()
{
if (Initialize())
this.Start();
}
public abstract bool Initialize();
public abstract void Start();
}
Oto klasa pochodna, którą tworzę.
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());
}
}
Wątpię, czy można wykonać C# wykonać konstruktor pochodny przed konstruktorem bazowym; tak naprawdę szukam rozwiązania do przekazania obiektu do klasy pochodnej, zanim obiekt zostanie użyty.
Zrobiłem to poprzez umieszczenie bloku Initialize/Start if wewnątrz konstruktora MyDerived
. Istnieją jednak inne klasy wywodzące się z klasy bazowej; więc musiałem powtórzyć ten blok kodu Initialize/Start w każdej wyprowadzonej klasie. Chciałbym zobaczyć alternatywę dla modyfikacji klasy bazowej.
Możliwe jest utworzenie pustych nadpisań metod Initialize/Start i przeniesienie kodu do metod derivInitialize/derivedStart, a następnie w konstruktorze pochodnym wywołanie 'if (derivedInitialize()) derivedStart()'. Nie może być eleganckich rozwiązań, ale są jeszcze inne sposoby. – James
Podczas gdy często dobrze jest, aby szkielet próbował zapobiec ekspozycji niekompletnie skonstruowanych obiektów, zdarzają się sytuacje, w których bardziej przydatna dla klasy byłaby możliwość dostępu do takich obiektów, z zastrzeżeniem, że musi być ona przygotowana z częściowo skonstruowanymi obiektami. Na przykład, jeśli klasa będzie enkapsulować obiekt 'IDisposable', którego czas życia będzie zgodny z jego własnym, byłoby wygodne użycie inicjalizatora pola do skonfigurowania; Niestety w C# nie ma czystej drogi, aby to zrobić bezpiecznie. Jeśli konstruktor klasy podstawowej wyrzuci, nic nie będzie w stanie uzyskać odniesienia do rzeczy wymagającej utylizacji. – supercat