问题1:在派生类中命名了同名的属性或者方法,会显示有问题,但是会编译成功?而且貌似默认成是new了,

 class Program
    {
        static void Main(string[] args)
        {
            contact [] contacts=new contact [2];
             contacts[0]=new class1();
             contacts[1]=new class2();
             class2 c2 = new class2();
             class1 c1 = new class1();
             contacts[0].A = "1";
             Console.WriteLine(c1.A);
             foreach(contact ct in contacts)
             {
                   //ct.A = "9";

                   Console.WriteLine(ct.prinf());
                   Console.WriteLine(ct.A);
                   Console.WriteLine(c2.prinf());
              }

        }
    }
    abstract public class contact
    {
        public virtual string prinf()
        {
            return ("这是虚方法");
        }
        string a="0";

        public virtual string A
        {
            get { return a; }
            set { a = value; }
        }
    }

    public class class1 : contact
    {
        public override string prinf()
        {
            return ("这是新的方法");
        }
        string a="6";
        public  string A
        {
            get { return a; }
            set { a = value; }
        }
    }
    public class class2 : contact
    {
        public new string prinf()
        {
            return ("这是另一个新的方法");
        }
    }


显示:
6
这是新的方法
1
这是另一个新的方法
这是虚方法   // 这里没有重载prinf();
0
这是另一个新的方法。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
问题2:
后来看书,多态性。
Animal myanimal=mycow();相当于是把某基本类型的变量赋予其派生类变量(这句话真绕,我的理解是派生类=》给基类)而myanimal调用基类方法相当于从派生类中调用这个方法,但他不能调用只在派生类中定义的方法。我的理解是,即使把派生类的变量给了基类变量,但是归根到底myanimal是基类变量,所以不能用只在派生类中才有的东西。如果要用需要类型转换。
对于上面代码。contacts[1]是基类即使给了new class2,也不能调用他的prinf。
而对于class1中的属性A,似乎也是new的了。
contacts[0].A相当于重载基类的A。即如果去掉contacts[0].A = "1";则也会输出contacts[0].A = "0";
posted on 2008-03-31 16:06  风孤鸿  阅读(208)  评论(0编辑  收藏  举报