C#继承中方法的调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyTest
{
    class Number
    {
        public Number()
        {
            Console.WriteLine("我是父类的构造函数");
        }
        public void test()
        {
            Console.WriteLine("纯测试");
        }
        public static int i = 123;
        public virtual void ShowInfo()
        {
            Console.WriteLine("base class.....");
        }
        public virtual void ShowNum()
        {
            Console.WriteLine(i.ToString());
        }
    }
    class IntNumber : Number
    {
        public IntNumber()
        {
            Console.WriteLine("我是子类的构造函数");
        }
        public void test()
        {
            Console.WriteLine("纯测试子类");
        }
        new public static int i = 456;
        public new virtual void ShowInfo()
        {
            Console.WriteLine("son class.....");
        }
        public override void ShowNum()
        {
            Console.WriteLine("base num is {0}",Number.i.ToString());
            Console.WriteLine("new num is {0}",i.ToString());
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Number num = new Number();
            num.ShowNum();
            IntNumber intnum = new IntNumber();
            intnum.ShowNum();
            intnum.ShowInfo();

            Number number = new IntNumber();
            number.test();
            number.ShowInfo();
            number.ShowNum();
        }
    }
1.父类引用指向父类对象:调用的时候只能调用父类的方法,方法表中根本没有子类。
2.子类引用指向子类对象:调用的时候既能调用子类的方法,也能调用从父类继承的方法(包括虚方法和实例方法<存疑:既然子类的方法表中没有父类的实例方法,它是如何由子类引用调到的呢?>),特别注意,在调用子类的构造函数的时候,会首先调用父类的构造方法!ps.方法表:包括非虚方法表和虚方法表,按照继承的虚方法、新引入的虚方法、实例方法和静态方法排列。
3.父类引用指向子类对象:
第一点:在调用构造函数的时候仍然是按照先父类构造函数,再子类构造函数的方法进行调用。
第二点:父类引用是无法调用父类中没有,而子类特有的方法的。
第三点:对于父类和子类都有的同名方法(除去构造方法)又分以下几种情况:
  1.对于实例方法,只执行父类的方法,子类的没有被执行。
  2.对于虚方法,如果子类有覆写override,则只执行子类的方法,将父类的虚方法屏蔽掉。
  3.对于虚方法,如果子类有一个new关键字,也就是说父类和子类是两个不同的虚方法,则只执行父类的虚方法。<其实没有new的话不也是只执行父类的方法虚方法么?这有什么用?new用作隐藏父类的同名成员,语义上和override互斥>
4.关于继承的层次问题。
孙子类重写override方法,如果父类和爷爷类都有虚方法,则只重写父类的虚方法。如果爷爷类特有的虚方法,则重写爷爷类的虚方法,一直能递归到object的虚方法
 
 
 
posted on 2013-05-03 09:29  叶龙  阅读(2104)  评论(0编辑  收藏  举报