簡體   English   中英

實例訪問繼承的抽象的類成員

[英]instance access to class members of inherited abstract

我猜這是星期四的理論。

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(),只會打印一個“”。 為什么不? 謝謝。

問題是編譯器不知道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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM