2017-02-22 6 views
-1

はここで状況のパラメータ制限します。私は、クラスと派生クラスはメソッドとして、派生クラスのインスタンスを渡すと

public class MyClass 
{ } 

public class MyDerivedClass : MyClass 
{ } 

を有し、また、私は、パラメータとしてMyClassのインスタンスを取ります(外部クラスの)メソッドがあります:私はDoSomething方法を制限することができますどのように

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

MyClassのインスタンスのみを受け入れますが、インスタンスはMyDerivedClassではありませんか?

+5

は、なぜあなたはそれをしたいと思うことができますか? – Philippe

+0

できません。あなたは、実行時に型をチェックし、例外をスローしますが、コンパイラは、あなたが求める何 – pinkfloydx33

+3

を防ぐことができ、何もオブジェクト指向プログラミングに対してではありません、*** MyDerivedClass ** MyClassの*** ISことができます。それは「私は車を望んでいないが、私はフェラーリがほしい」と同じです。 – 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/

希望これは

関連する問題