Zasadniczo mam następujący scenariusz:Czy można programowo wymusić klasa pochodna, aby przekazać się do klasy bazowej jako typ ogólny?
public abstract class FooBase<T> where T : FooBase<T>
{
public bool IsSpecial { get; private set; }
public static T GetSpecialInstance()
{
return new T() { IsSpecial = true };
}
}
public sealed class ConcreteFooA : FooBase<ConcreteFooA> { ... }
public sealed class ConcreteFooB : FooBase<ConcreteFooB> { ... }
ale problem widzę tutaj jest to, że mogłem zrobić ConcreteFooB : FooBase<ConcreteFooA> { ... }
, które całkowicie bałagan klasy w czasie wykonywania (nie spełniałby logikę I próbuję osiągnąć), ale nadal poprawnie się kompiluje.
Czy jest jakiś sposób, w jaki nie myślałem o wymuszeniu generycznego, aby być czymkolwiek, co jest klasą pochodną?
Aktualizacja: I nie kończy się za pomocą parametru rodzajowego, T, w klasie FooBase<T>
, ja po prostu nie wymienić każdą metodę, która ma go jako out i parametr, ale mam zastosowanie dla T.
Wyrzuć wyjątek, jeśli w typie "typeof (this)! = Typeof (T)", w konstruktorze? A może szukasz rozwiązania w czasie kompilacji? – Oded
Jest to tak zwany dziwnie powtarzający się wzorzec szablonu lub ciekawy powtarzający się ogólny wzór. –
@DanielHilgarth - Nie myślałem tak daleko przed nami;) – Oded