2016-07-05 6 views
0

これは私が作った別の投稿とよく似ていますが、C#で同様のプログラムを書いています。 私はカードのクラスであり、カードのサブクラスであるクラスLandを持っています。 Javaの場合、私はinstanceofを使ってカードの子であるかどうかを判断しました。 オブジェクトが変数c で開催されるために呼ばれて、私はすでに試してみました:c#クラスが別のクラスのサブタイプであるかどうかをテスト

if (typeof (Land).isSubClassOf(typeof(Card))){ 
//random code 
} 

は、私は何をしようとしている、Javaで、次のようになります。直接の継承のために

if (c instanceof Land){ 
} 
+1

あなたがこれを確認しましたか? http://stackoverflow.com/questions/282459/what-is-the-c-sharp-equivalent-to-javas-instanceof-and-isinstance – Lapious

+3

'if(c is Land)'? – juharr

+0

'YourObject.GetType.IsAssignableFrom(YourParentClass.GetType()); ' –

答えて

1

タイプを確認しないでください。次にキャストしてください。あなたがそうするなら、あなたは本当にタイプを2回チェックしています。 cその後lがそれを含んでいますLandとしてキャストできる場合

var l = c as Land; 

:これを行います。そうでない場合はnullになります。

あなたが行う場合は、この:

if(c is Land) 
    l = (Land)c; 

次に、あなたが実際には2回cを検査しています。一度そのタイプがLandであるかどうかをチェックしてから、実際のキャストをやり直してください。

C# As keyword

+0

チェックはifステートメントの真中にあり、私は暗黙のうちに土地をブールにキャストすることはできないと言っています。 – comphunter159

+0

このメソッドを使うと、ほとんどの場合、私はカードの型を保持する変数を宣言していたので、その変数に直接チェックして、 。他のタイプのカードがプログラムに入ってきたときに違いが生じた – comphunter159

+0

ブールチェックをしているだけであれば、これは重要ではありません。しかし、もしそれが特定の型ならばその型にキャストする必要があることを知る必要があるならば、時間の99%。これは、 '' as 'が入るところです。なぜなら、チェックしてからキャストするのを避けるからです。 –

2

static void Main(string[] args) 
{ 
    Land c = new Land(); 
    bool isCard = c.GetType().IsSubclassOf(typeof(Card)); 
} 

または:

static void Main(string[] args) 
{ 
    Land c = new Land(); 
    bool isCard = c is Card; 
} 
+0

私は見たもの以外は何もしませんでした。ありがとうございます@ user3185569 – comphunter159

+0

@ comphunter159答えに何か間違っていますか? – user3185569

+0

この回答の主な問題は、カードにはいくつかの子孫(土地、呪文など)があり、使用された方法では、私はカードオブジェクトを渡します。私はカードがこのメソッドを使用している土地であるかどうかを調べるためにカードをテストすれば、カードが土地であるかどうかを確認したいときは常に真となります。 – comphunter159

3
if(foo is Bar) { 
    return (Bar)foo; 
} 
関連する問題