Итак, моя дилемма в том, что для доступа к IntThing
или StringThing
* MyProperty
из UtilityThing<T>
я определяю интерфейс с MyProperty
и использую его как общее ограничение для T
в UtilityThing<T>
.Это работает, но кажется избыточным, учитывая, что то же свойство уже определено в абстрактной базе.Я пропускаю аспект дизайна здесь, или это действительно так, как это нужно сделать в данном случае?
public interface IThing {
string MyProperty { get; set; }
}
public abstract class Thing<T> {
protected string _MyProperty;
public abstract string MyProperty { get; set; }
public T OtherProperty { get; set; }
public string CommonMethod() {
return MyProperty + "foobar";
}
}
public class IntThing : Thing<int?>, IThing {
public override string MyProperty {
get { return _MyProperty; }
set { _MyProperty = value + OtherProperty.ToString(); }
}
}
public class StringThing: Thing<string>, IThing {
public override string MyProperty {
get { return _MyProperty; }
set { _MyProperty = OtherProperty + value; }
}
}
public class UtilityThing<T> where T: IThing, new() {
public T DoIt(SomeContext someContext, string name) {
string contextVal = someContext.GetValue(name);
var thing = new T { MyProperty = contextVal }
return thing;
}
}