属性所需的基类

本文关键字:基类 属性 | 更新日期: 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;}
}

那么,我怎样才能制作一个接口式的解决方案,MyClassMyOtherClass必须有一个属性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;}
}

由于 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; }
    }
}

这假定未指定的要求"我希望在实现类中具有派生类型的成员"MyPropClass _actualProperty满足。

这不会确保 setter 的类型安全性,这可能会在设置错误类型的变量(在本例中为 MyOtherPropClass )时引发强制转换异常。