类的继承和多态

   今天我们复习了学过的类的继承和多态 也扩展了一点没学过的知识。
 类的继承: 个人理解就是使子类可以使用父类中权限为public 和 protect  权限的方法。

格式   子类名:父类名{ };

多态:个人理解就是父类中的方法可以在子类中的同名方法以另一个内容的方式出现;

用法:

创建一个父类为哺乳动物(Mammal)类,子类是马(House)类和鲸鱼类(Whale);

Mammal.cs  哺乳动物类

  class Mammal
    {
        private string name;
        public Mammal(string fname)
        {
            name = fname;
        }
        public string GetName()   //因为父类中的name权限为private,这个方法是为了让子类中的方法也可以使用的了传过来的姓名。
        {        
            return name;
        }
        public virtual void breath() // 如果预料到此方法在将来会被重写,则这个方法必须被声明为 virtual ;
        {
            Console.WriteLine(name+"正在用肺呼吸。。。");
        }
        public void suckleyoung() {
            Console.WriteLine(name+"正在哺乳。。。");
        }
    }

Whale.cs 鲸鱼类

class Whale:Mammal   //继承与哺乳动物类
    {
        public Whale(string name) : base(name) { }  //这是为了让子类初始化一个实例的名能够传到父类的name,使父类的构造函数运行; base 是子类传给父类东西的关键字
        public void swim() {
            Console.WriteLine(GetName()+"....."); //用父类的GetName()方法来获得传到父类的名称。
        }
        public new void suckleyoung()  //用 new 来重写就可以不用在父类中的同名方法中声明 virtual ;
        {
            Console.WriteLine(GetName()+"正在哺育下一代。。。。");
        }
    }

House.cs 马类

class House:Mammal
    {
        public House(string name) : base(name) { } //不能加分号。。。。
       
        public void run() {
            Console.WriteLine(GetName()+"哒哒哒。。。");
        }
        public override void breath()  //要用Override重写方法 在父类中的同名方法处必须声明 virtual ;
        {
            Console.WriteLine(GetName() + "正在大口呼吸。。。");
        }
    }

 

Program 类

  class Program
    {
        static void Main(string[] args)
        {
            Mammal f = new Mammal("哺乳动物");
            f.suckleyoung();
            House h = new House("小马");
           
            h.run();
            h.breath();
            Whale w = new Whale("小鲸");
            w.suckleyoung();
          
            //类的赋值
            //父类可以引用子类对象。
            //父类引用只能调用子类继承父类的方法,父类引用不能调用子类独有的方法。
            Mammal ss = new House("ss");
            ss.breath();
            ss.suckleyoung();

            //子类引用不能直接赋值父类对象,除非将父类对象进行强制转换
            //编译ok,运行异常
            try
            {
                Whale SSS = (Whale)new Mammal("sss"); //将父类对象强制转换为 Whale子类对象 虽然可以编译成功但却不能执行任何父类和子类的方法。
                SSS.breath();
            }
            catch(Exception ex) {
                Console.WriteLine(ex.Message);  //将执行期间发生的错误写出来。
            }
            w.swim();
            Console.ReadKey();
        }
    }

 

 

 

posted on 2012-09-04 17:22  gongth_12  阅读(132)  评论(0编辑  收藏  举报

导航