2012-05-09 9 views
1

どうすればいいですか?
ABから継承されても、を呼び出した後、私のAオブジェクトがnullです。機能多型。 A:B

class Program 
{ 
    public class A : B 
    { 
    } 

    public class B 
    { 
    } 

    static void Main(string[] args) 
    { 
     A a = GetB() as A; 
     Console.WriteLine(a == null); // it is null! 

     Console.WriteLine("Console.ReadKey();"); 
     Console.ReadKey(); 
    } 
    public static B GetB() 
    { 
     return new B(); 
    } 
} 
+1

クラスC:B {}。 CはAですか?明らかにそうではありません。どのようにそれができますか?あなたはなぜあなたが* BをAにキャストできなければならないと思いますか? AはBを継承します。 AはBです、それははっきりと分かります。 B?それはCDかもしれないし、多分それは単なる古くからのB.だ@ –

+0

@AnthonyPegram私の答えは以下を参照してください、我々はあまりにも似て考える... – goric

+0

エラーは[より発音](http://c2.com/cgi/wiki?FailFast)あなたが古いスタイルの鋳造をするならば。つまり、 'A a =(A)GetB()' –

答えて

1

あなたはBをAにダウンキャストしようとしています。あなたはそれを行うことはできませんし、BがAになるかどうかわからないので意味がありません。 Aクラスのコンストラクタでは、Bがパラメータとして使用されます。

public class A : B 
{ 
    public A(B b) 
    { 
     //perform your conversion of a B into an A 
    } 
} 

public class B 
{ 
    public B(){} 
} 

static void Main(string[] args) 
{ 
    B b = new B(); 
    A a = new A(b); 
    Console.WriteLine(a == null); // it is null! 

    Console.WriteLine("Console.ReadKey();"); 
    Console.ReadKey(); 
} 
4

おそらくreturn new A();を意味します。現時点ではBAにダウンキャストしようとしていますが、これは動作しません。

1

あなたはそれが逆になった:

class Program 
{ 
    public class A : B // should be: public class A 
    { 
    } 

    public class B // should be: public class B : A 
    { 
    } 

    static void Main(string[] args) 
    { 
     // If you reverse the inheritance on code above 
     // As Ben Voigt noticed, *as A* is redundant. should be removed 
     // A a = GetB() as A; 

     // should be this. B is wider than A, so A can accept B, no need to cast 
     A a = GetB(); 
     Console.WriteLine(a == null); // it is null! 

     Console.WriteLine("Console.ReadKey();"); 
     Console.ReadKey(); 
    } 
    public static B GetB() 
    { 
     return new B(); 
    } 
} 
+1

この場合、 'as 'は必要ありません。 –

+0

コードを貼り付けてコピーし、エラーの主な原因を強調表示しました –

1

Bは非常によくAではないかもしれないので、あなたは、鋳造のこのタイプを実行することはできません!もちろん、ABのサブクラスなので、常にGetA() as B;を実行できます。しかし、それ以外の方法は意味をなさない。ほとんどの場合、Aのインスタンスは、Bのインスタンスに対していくつかの追加機能を提供します。

第3のクラスC : Bを追加することを検討してください。あなたの関数GetB()が実際にnew C()を返した場合はどうなりますか? CBなので、これは問題ありません。しかし確かにこれをAにキャストできないようにしたいのですか? ACはほとんど共通点がほとんどありません。