属性所需的基础 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;}
}

那么,我如何制作一个类似接口的解决方案,MyClassMyOtherClass 必须具有属性 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;}
}

因为 MyPropClassMyOtherPropClass 都继承了相同的基类型 BasePropertyClass。 通过这种方式,您可以分配给 Property1Property2 以及 MyPropClassMyOtherPropClass.

类型的对象

不能直接,因为实现的属性必须是接口中指定的类型。

替代@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;}
}