繁体   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