【问题标题】:Required base class for property属性所需的基类
【发布时间】:2015-03-05 05:57:20
【问题描述】:

我有一个具有属性的类,我想强制该属性是从基类型继承的类型

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 作为基本类型

【问题讨论】:

    标签: c# .net inheritance interface base-class


    【解决方案1】:

    为了更好地解释@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;}
    }
    

    【讨论】:

    【解决方案2】:

    您不能直接使用,因为实现的属性必须与接口中指定的类型完全一致。

    作为@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)。

    【讨论】:

      【解决方案3】:

      你可以只使用你的基本类型:

      public class MyClass
      {
          public BasePropertyClass Property1 { get; set;}
      }
      
      public class MyOtherClass
      {
          public BasePropertyClass Property2 { get; set;}
      }
      

      因为MyPropClassMyOtherPropClass 都继承了相同的基本类型BasePropertyClass。 这样,您可以分配给Property1Property2MyPropClassMyOtherPropClass 类型的对象。

      【讨论】:

        【解决方案4】:

        你可以让你的类通用并添加一个约束

        public class MyClass<T> where T : BasePropertyClass
        {
             public T MyPropThatMustInheritBasePropertyClass { get; set;}
        }
        

        【讨论】:

        • 只是为了澄清:之前的 MyClass 将是 MyClass&lt;MyPropClass&gt;,之前的 MyOtherClass 将是 MyClass&lt;MyOtherPropClass&gt;
        猜你喜欢
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多