我有一个具有属性的类,我想强制此属性属于从基类型继承的Type
public abstract class BasePropertyClass
{
public string A { get; set;}
}
public class MyPropClass : BasePropertyClass
{
public string B { get; set;}
}
public class MyOtherPropClass : BasePropertyClass
{
public string C { get; set;}
}
public class MyClass
{
public MyPropClass MyPropThatMustInheritBasePropertyClass { get; set;}
}
public class MyOtherClass
{
public MyOtherPropClass MyPropThatMustInheritBasePropertyClass { get; set;}
}
那么,我如何制作一个接口解决方案 MyClass 和 MyOtherClass 必须具有必须具有的属性 MyPropThatMustInheritBasePropertyClass BasePropertyClass 作为基本类型
答案 0 :(得分:3)
您可以使您的类具有通用性并添加约束
public class MyClass<T> where T : BasePropertyClass
{
public T MyPropThatMustInheritBasePropertyClass { get; set;}
}
答案 1 :(得分:0)
您可以使用您的基本类型:
public class MyClass
{
public BasePropertyClass Property1 { get; set;}
}
public class MyOtherClass
{
public BasePropertyClass Property2 { get; set;}
}
因为MyPropClass
和MyOtherPropClass
都继承了相同的基本类型BasePropertyClass
。
这样您就可以分配到Property1
或Property2
以及MyPropClass
或MyOtherPropClass
类型的对象。
答案 2 :(得分:0)
为了更好地解释@ Selman22的答案,你可以这样做:
public abstract class ConstrainedClass<T>
where T: BasePropertyClass
{
public T MyPropThatMustInheritBasePropertyClass { get; set;}
}
这样,如果你将另一个声明为这样的类:
public class MyClass:ConstrainedClass<MyPropClass>
{
}
public class MyOtherClass:ConstrainedClass<MyOtherPropClass>
{
}
您将获得与您在问题中声明的相同的类,并且您在属性中具有约束。
如果您的课程已经从另一个课程中学习,您还需要一个额外的步骤:
public interface ConstrainedInterface<T>
where T: BasePropertyClass
{
T MyPropThatMustInheritBasePropertyClass { get; set;}
}
之后必须明确定义两个属性:
public class MyClass : ConstrainedInterface<MyPropClass>
{
public MyPropClass MyPropThatMustInheritBasePropertyClass { get; set;}
}
和
public class MyOtherClass : ConstrainedInterface<MyOtherPropClass>
{
public MyOtherPropClass MyPropThatMustInheritBasePropertyClass { get; set;}
}
答案 3 :(得分:-1)
您不能直接使用,因为已实现的属性必须完全符合接口中指定的类型。
替代@Selman的通用解决方案,您可以使用支持字段:
public interface MyClassInterface
{
BasePropertyClass MyPropThatMustInheritBasePropertyClass { get; set;}
}
public class MyClass : MyClassInterface
{
private MyPropClass _actualProperty;
public BasePropertyClass MyPropThatMustInheritBasePropertyClass
{
get { return _actualProperty; }
set { _actualProperty = (MyPropClass)value; }
}
}
这假定未指定的要求&#34;我希望在MyPropClass _actualProperty
实现的实现类&#34; 中拥有派生类型的成员。
这不会确保setter的类型安全,在设置错误类型的变量时可能会抛出强制转换异常(在本例中为MyOtherPropClass
)。