2017-02-23 15 views
1

これは木曜日の理論です。継承された抽象のクラスメンバーへのインスタンスへのアクセス

Main()は_XLocalにアクセスできません。& _YLocal?ここで

using System; 

namespace HelloGoodbyeOperator { 

    public abstract class HGOperator { 
     public string _greeting { get; set; } 
     public bool _x { get; internal set; } 
     public bool _y { get; internal set; } 

     public static implicit operator HGOperator(bool mode) { 
      object ret = new object(); 
      if (mode) 
       ret = new HGOperator_Hello { _greeting = "hello", _XLocal = 10 }; 
      else 
       ret = new HGOperator_Goodbye { _greeting = "goodbye", _YLocal = 20 }; 

      return (HGOperator)ret; 
     } 
    } 



    public class HGOperator_Hello : HGOperator { 
     public int _XLocal { get; set; } 
     public HGOperator_Hello() { _x = true; Console.WriteLine("HGOperator_Hello //" + _XLocal.ToString() + "\\\\"); } 
    } 



    public class HGOperator_Goodbye : HGOperator { 
     public int _YLocal { get; set; } 
     public HGOperator_Goodbye() { _y = false; Console.WriteLine("HGOperator_Goodbye //", _YLocal, "\\\\"); } 

    } 



    class Program { 
     static void Main(string[] args) { 

      HGOperator hg = true; 
      Console.WriteLine(hg._greeting); 
      test(hg); 

      Console.WriteLine(""); 

      hg = false; 
      Console.WriteLine(hg._greeting); 
      test(hg); 

      Console.ReadKey(); 
     } 

     static void test(HGOperator hg) { 
      if (hg is HGOperator_Hello) { 
       Console.WriteLine(hg._x); 
       //Console.WriteLine(hg._XLocal); 
      } else { 
       Console.WriteLine(hg._y); 
       //Console.WriteLine(hg._YLocal); 
      } 
     } 
    } 
} 

は出力

HGOperator_Hello // 0 \

ハロー

HGOperator_Goodbye //

別れ

です

私はHGOperator_Helloタイプのhg._YLocalにアクセスしようとすると、悪夢&その逆になるかを理解することができます。しかし、まだ私はそれぞれのメンバーに慎重に行くことができると思うだろう。

また、私はこれが本当のことだと思います。 2つのコンストラクターは、Console.Writeline()で_XLocalの値を持たない& _YLocalです。 .ToString()がなければ ""だけが表示されます。何故なの?おかげさまで

+0

ここで、「メイン」は?質問は何ですか? –

+1

@GlennFerrieどこにいるのですか?笑。 'クラスプログラム{ static void Main(文字列[] args){' – Steve

答えて

2

問題は、hgHGOperator_HelloまたはHGOperator_Goodbyeの派生型であることをコンパイラが認識していないことです。したがって、ifの中に別の変数を作成してキャストする必要があります。

if (hg is HGOperator_Hello) 
{ 
    var helloHg = (HGOperator_Hello)hg; 
    Console.WriteLine(helloHg._x); 
    Console.WriteLine(helloHg._XLocal); 
} 
else 
{ 
    var goodbyeHg = (HGOperator_Goodbye)hg; 
    Console.WriteLine(goodbyeHg._y); 
    Console.WriteLine(goodbyeHg._YLocal); 
} 
+1

ハッハッハ!私はそれを見たことがないだろう。助けをありがとう – Steve

+0

私はちょうどこの実現を持っていた。コンパイラがhgが_Helloクラスであることを知っているかどうかは、実際に証明されています。あなたの答えは間違っているとは言いません。私はちょうどコンパイラ_could_少しスマートな機能をここに与えられることを言っている。私はif()テストが実行時の課題のほうが多いと認識していますが、system_could_はそれを知っている人を知っている人を知っていて、あらかじめコンパイルしていれば、hgは_Helloでなければなりません。次のバージョンだと思います。 – Steve

関連する問題