需要访问从通用抽象基派生的 类 中的重写抽象 属性 的接口吗?
Interface needed to access overridden abstract property in classes derived from generic abstract base?
所以我的困境是,为了从 UtilityThing<T>
访问 IntThing
或 StringThing
的 MyProperty
,我定义了一个接口 MyProperty
并将其用作 UtilityThing<T>
中 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;
}
}
您需要引入新的通用类型。一旦引入新类型,您就可以消除对接口的需求。
public class UtilityThing<T, I> where T : Thing<I>, new()
{
public T DoIt(SomeContext someContext, string name)
{
string contextVal = someContext.GetValue(name);
var thing = new T { MyProperty = contextVal };
return thing;
}
}
你可以这样使用它:
var utility = new UtilityThing<IntThing, int?>();
所以我的困境是,为了从 UtilityThing<T>
访问 IntThing
或 StringThing
的 MyProperty
,我定义了一个接口 MyProperty
并将其用作 UtilityThing<T>
中 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;
}
}
您需要引入新的通用类型。一旦引入新类型,您就可以消除对接口的需求。
public class UtilityThing<T, I> where T : Thing<I>, new()
{
public T DoIt(SomeContext someContext, string name)
{
string contextVal = someContext.GetValue(name);
var thing = new T { MyProperty = contextVal };
return thing;
}
}
你可以这样使用它:
var utility = new UtilityThing<IntThing, int?>();