2017-02-22 77 views
-1

这里的情况。我有一个类和派生类限制传递派生类的实例作为方法参数

public class MyClass 
{ } 

public class MyDerivedClass : MyClass 
{ } 

同时,我有一种方法(在外部类),它利用了MyClass一个实例作为参数:

public class AnotherClass { 
    public void DoSomething(MyClass myClass) 
    { } 
} 

我怎样才能限制DoSomething方法仅接受MyClass的实例,但不接受MyDerivedClass的实例?

+5

你为什么要这么做? – Philippe

+0

你不能。您可以在运行时检查类型和抛出一个异常,但没有编译器可以防止 – pinkfloydx33

+3

是对面向对象的编程什么你问,*** MyDerivedClass ** ** IS MyClass的***。这就像“我不想要一辆车,但我想要一辆法拉利!” – Esko

回答

1

如果这是你需要的代码来检查自己,如果它是一个派生类型通过异常告诉调用代码派生类型的对象是不允许这种方法,你想那什么:

public class AnotherClass { 
    public void DoSomething(MyClass myClass) 
    { 
     if(myClass.GetType() != typeof(MyClass)) 
     { 
      throw new Exception("Derived objects not allowed"); 
     } 
    } 
} 
+0

尽管我不会推荐OP想要的内容(出于同样问题的意见),但这是正确的方法来满足OP(不常见)请求。 – casperOne

+0

如果此问题应该标记为正确的答案被认为是不被推荐的做法? –

+0

@AntonVoronin如果它回答了问题的答案,并且答案解决了这个特定的问题,那么在接受它的过程中没有伤害:) –

1

你想在这里做什么更关系到一个在所有编程语言中很常见的不变性问题。

意味着你可以只使用最初指定的类型;所以一个 不变一般类型参数既不是协变也不 逆变。不能IEnumerable的 (IEnumerable的)的实例分配给 IEnumerable类型或反之亦然的变量。

这里是你https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

我的建议的参考,尝试改变的实施,并把所有的方法变成一个接口,这应该是比较清楚

class Root: Interface 
{ 
...implementation of your common methods 
} 

class Derived: Interface 
{ 
    ...implementation of your common methods 
    //this should just 
    public void DoSomething(MyClass myClass) 
} 

如果你不”要使用上述方法,然后使用“as”运算符将您传递的参数作为MyRootClass,var a = parameter as MyRootClass进行处理。如果是那么你是不正确的值传递给方法,或者检查是否有直接的类型。

如果建议您阅读本主题:

http://amapplease.blogspot.com/2009/04/invariance-covariance-contravariance.html https://stackoverflow.com/a/13107168/819153 https://blogs.msdn.microsoft.com/ericlippert/2009/03/19/representation-and-identity/

希望这有助于

相关问题