属性所需的基类
本文关键字:基类 属性 | 更新日期: 2023-09-27 18:36:29
我有一个具有属性的类,我想强制此属性属于从基类型继承的类型
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作为基类型。
你可以使类泛型并添加约束
public class MyClass<T> where T : BasePropertyClass
{
public T MyPropThatMustInheritBasePropertyClass { get; set;}
}
为了更好地解释@Selman22答案,你可以做这样的事情:
public abstract class ConstrainedClass<T>
where T: BasePropertyClass
{
public T MyPropThatMustInheritBasePropertyClass { get; set;}
}
这样,如果您将 other 声明给这样的类:
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;}
}
你可以只使用你的基本类型:
public class MyClass
{
public BasePropertyClass Property1 { get; set;}
}
public class MyOtherClass
{
public BasePropertyClass Property2 { get; set;}
}
由于 MyPropClass
和 MyOtherPropClass
都继承相同的基类型,因此BasePropertyClass
.这样,您可以分配给Property1
或Property2
以及类型为 MyPropClass
或 MyOtherPropClass
的对象。
不能直接使用,因为实现的属性必须与接口中指定的类型完全相同。
作为 @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; }
}
}
这假定未指定的要求"我希望在实现类中具有派生类型的成员",MyPropClass _actualProperty
满足。
这不会确保 setter 的类型安全性,这可能会在设置错误类型的变量(在本例中为 MyOtherPropClass
)时引发强制转换异常。