Считаете ли вы приемлемой или плохой практикой создание абстрактного универсального класса, который принимает в качестве параметра типа класс, производный от самого себя?
Это позволяет абстрактному универсальному классу манипулировать экземплярами производного класса и, в частности, возможностью создавать новые () экземпляры производного класса по мере необходимости и может помочь избежать повторения кода в конкретных классах, которыепроизводные от него.
Если «плохо», какую альтернативу вы предпочитаете обрабатывать в таких ситуациях и как бы вы структурировали приведенный ниже код?
Например: -
// We pass both the wrapped class and the wrapping class as type parameters
// to the generic class allowing it to create instances of either as necessary.
public abstract class CoolClass<T, U>
where U : CoolClass<T, U>, new()
{
public T Value { get; private set; }
protected CoolClass() { }
public CoolClass(T value) { Value = value; }
public static implicit operator CoolClass<T, U>(T val)
{
// since we know the derived type and that its new(), we can
// new up an instance of it (which we couldn't do as an abstract class)
return new U() { Value = val};
}
public static implicit operator T(CoolClass<T, U> obj)
{
return obj.Value;
}
}
И второй бонусный вопрос: почему ОДИН из этих неявных операторов работает, а другой нет?
Например,
public class CoolInt : CoolClass<int, CoolInt>
{
public CoolInt() { }
public CoolInt(int val) (val) { }
}
// Why does this not work
CoolInt x = 5;
// when this works
CoolInt x2 = (CoolInt)5;
// and this works
int j = x;