属性所需的基础 class
Required base class for property
我有一个 class 有一个属性,我想强制这个属性是从基类型继承的类型
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 作为基类型
您可以使 class 通用并添加约束条件
public class MyClass<T> where T : BasePropertyClass
{
public T 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; }
}
}
这假设未指定的要求 "I want to have a member of the derived type in the implementing class",MyPropClass _actualProperty
满足。
这不会确保 setter 的类型安全,这可能会在设置错误类型的变量时抛出强制转换异常(在本例中 MyOtherPropClass
)。
为了更好地解释@Selman22 的回答,您可以这样做:
public abstract class ConstrainedClass<T>
where T: BasePropertyClass
{
public T MyPropThatMustInheritBasePropertyClass { get; set;}
}
这样,如果你像这样声明另一个给classes:
public class MyClass:ConstrainedClass<MyPropClass>
{
}
public class MyOtherClass:ConstrainedClass<MyOtherPropClass>
{
}
您将获得与您在问题中声明的相同的 classes,而且您在 属性.
中有约束
如果您的 classes 已经从另一个 class 中删除,您需要一个额外的步骤:
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;}
}
我有一个 class 有一个属性,我想强制这个属性是从基类型继承的类型
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 作为基类型
您可以使 class 通用并添加约束条件
public class MyClass<T> where T : BasePropertyClass
{
public T 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; }
}
}
这假设未指定的要求 "I want to have a member of the derived type in the implementing class",MyPropClass _actualProperty
满足。
这不会确保 setter 的类型安全,这可能会在设置错误类型的变量时抛出强制转换异常(在本例中 MyOtherPropClass
)。
为了更好地解释@Selman22 的回答,您可以这样做:
public abstract class ConstrainedClass<T>
where T: BasePropertyClass
{
public T MyPropThatMustInheritBasePropertyClass { get; set;}
}
这样,如果你像这样声明另一个给classes:
public class MyClass:ConstrainedClass<MyPropClass>
{
}
public class MyOtherClass:ConstrainedClass<MyOtherPropClass>
{
}
您将获得与您在问题中声明的相同的 classes,而且您在 属性.
中有约束如果您的 classes 已经从另一个 class 中删除,您需要一个额外的步骤:
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;}
}