财产

2015-01-07 156 views
0

所需的基类我有了一个属性的类,我想迫使这家酒店是从基类继承财产

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作为碱型-ish溶液

回答

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

您将获得与您在问题中声明的相同的类,再加上属性中的约束。

如果你的类已经从另一个类inerhits,你需要一个额外的步骤:

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

Thx,我不知道你可以在Interfaces中使用泛型。今天我学到了;-) –

+0

@Niko如果你想了解更多关于泛型和接口的内容,请看这里: http://msdn.microsoft.com/en-us/library/dd799517%28v=vs.110% 29.aspx –

3

ÿ OU可以让你的类通用和添加约束

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

只是为了澄清:以前的MyClass将是“MyClass ”和以前的MyOtherC lass将是'MyClass ' –

0

你可以只使用基本类型:

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

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

因为两者MyPropClassMyOtherPropClass继承了相同的基本类型,BasePropertyClass。 通过这种方式,您可以指定Property1Property2MyPropClassMyOtherPropClass类型的对象。

-1

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

替代@塞尔曼的通用解决方案,你可以这样做使用支持字段:

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)时,可能会抛出强制异常。