Po raz pierwszy zobaczyłem, że kolega robi to, gdy zaimplementował pule obiektów. Przekazał klasę, która miała zostać połączona jako parametr do ogólnej klasy bazowej. Ta klasa bazowa ułożyła kod łączenia.Czy pozwala klasie przejść się jako parametr do ogólnego zła klasy podstawowej?
Dziwne, że klasa bazowa będzie znała swoje dzieci. Jest to uważane za złą praktykę w każdym zwykłym przypadku. Ale w tym przypadku rodzic jest po prostu rozwiązaniem technicznym, aby uniknąć pisania powtarzalnego kodu. Klasa bazowa nigdy nie jest przywoływana przez żaden inny kod.
Jedną wadą tej konstrukcji jest to, że "pali klasę podstawową". Nie można wprowadzić ogólnej klasy bazowej w środku hierarchii. Ten problem może być poza tematem.
Poniżej jest do pomyślenia przykład:
public abstract class Singleton<T> where T : class
{
public static T Instance { get; private set; }
public Singleton()
{
if (Instance != null)
throw new Exception("Singleton instance already created.");
Instance = (T) (object) this;
}
}
public class MyClass : Singleton<MyClass>
{
}
kod Poprawiona:
public abstract class Singleton<T> where T : Singleton<T>
{
public static T Instance { get; private set; }
public Singleton()
{
if (Instance != null)
throw new Exception("Singleton instance already created.");
Instance = (T) this;
}
}
public class MyClass : Singleton<MyClass>
{
}
Wysadzasz mój umysł tym ostatnim zdaniem. klasa SingleTon gdzie T: Singleton ? Czy nie wymagałoby to ciągłej rekurencji (każdy T musiałby być Singletonem , gdzie T byłby znowu singletonem , itp.) –
Kristof
Dodano ulepszenie kodu SLKS. Pierwsza linia sprawia, że twoja głowa się kręci. –
@Kristof Zobacz przykład: 'public MyClass: Singleton' powyżej.Typ, 'MyClass' IS-A' Singleton 'tak to działa. Mimo to wciąż jest trochę melodyjna. –