属性所需的基类

时间:2015-01-07 10:51:26

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

我有一个具有属性的类,我想强制此属性属于从基类型继承的Type

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

4 个答案:

答案 0 :(得分:3)

您可以使您的类具有通用性并添加约束

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

答案 1 :(得分:0)

您可以使用您的基本类型:

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

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

因为MyPropClassMyOtherPropClass都继承了相同的基本类型BasePropertyClass。 这样您就可以分配到Property1Property2以及MyPropClassMyOtherPropClass类型的对象。

答案 2 :(得分:0)

为了更好地解释@ Selman22的答案,你可以这样做:

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

这样,如果你将另一个声明为这样的类:

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

答案 3 :(得分:-1)

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

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

这假定未指定的要求&#34;我希望在MyPropClass _actualProperty实现的实现类&#34; 中拥有派生类型的成员。

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