2017-02-23 101 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將是一場噩夢&反之亦然。但是仍然會認爲我可以謹慎地向各個成員求助。

此外,我敢打賭,這是真實的。這兩個具體構造函數在Console.Writeline()中沒有_XLocal的值_YLocal。沒有.ToString()只打印一個「」。爲什麼不? 謝謝。

+0

其中是'Main'?什麼是問題? –

+1

@GlennFerrie永遠在哪裏。大聲笑。 'class Program {static void Main(string [] args){' – Steve

回答

2

問題是編譯器不知道hgHGOperator_HelloHGOperator_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_有智慧知道,預編譯,if-true,然後hg必須是_Hello。我想下一個版本。 – Steve