C#基础强化-继承与多态

/**
  特性:
    单根性:一个子类只能有一个父类
    传递性:爷爷类 爹类 儿子类
  里氏转换
    1、子类可以赋值给父类
    2、如果父类装的是子类对象,则可以将这个父类转换为对应的子类 is as 关键字
    -->关键字
      1、is:返回bool类型,指示是否是这个类型
      2、as:如果转换成功返回对象,否则返回null
    作用:我们可以将所有的子类当做是父类来看,针对父类进行编程,写出通用代
    码,适应需求的不断改变
  多态:
    -->虚方法
      virtual override
    -->抽象类
      abstract override
    -->接口
      interface

*/

普通类的继承

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

/**
  继承中的非多态方式,很恶心人吧
  虚方法和抽象方法就是为了解决这个问题的
*/
namespace 普通类的继承 {
    class Program {
        static void Main(string[] args) {
            passen[] pas = { new Liuguan(), new Wangming() };
            foreach(passen item in pas) {
                if(item is Liuguan) {
                    (item as Liuguan).Function();
                }
                if(item is Wangming) {
                    (item as Wangming).Function();
                }
                //item.Function();该方式,打印出来都是"我是人"
            }
            Console.ReadLine();
        }
    }
    class passen {
        public void Function() {
            Console.WriteLine("我是人");
        }
    }
    class Liuguan : passen {
        public new void Function() {
            Console.WriteLine("我是刘冠");
        }
    }
    class Wangming : passen {
        public new void Function() {
            Console.WriteLine("我是王明");
        }
    }
}

抽象类的继承

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

namespace 抽象类的继承 {
    class Program {
        static void Main(string[] args) {
            //多态,父类可指向子类对象
            //子类可以赋值给父类,但调不出子类新增方法,反之不可
            animal[] ani = { new Cat(), new Dog(), new Pig() };
            foreach(animal item in ani) {
                item.Bark();               
                if(item is Cat) {//判断类型
                    Cat tempItem = (Cat)item;                    
                    tempItem.TextFunction();
                    //两个等价
                    Cat tempItem2 = item as Cat;
                    tempItem2.TextFunction();
                }
            }

            Console.ReadLine();
        }
    }
    //抽象类,抽象方法
    abstract class animal {
        public abstract void Bark();//抽象方法包含于抽象类中类,应用场景:父类没有办法如何确定子类如何去实现

    }
    //一个子类继承了一个抽象类,那么这个子类必须重写这个抽象父类中的所有成员
    class Cat : animal {
        public override void Bark() {//子类重写父类方法
            Console.WriteLine("cat");
        }
        public void TextFunction() {
            Console.WriteLine("测试方法");
        }
    }
    class Dog : animal {
        public override void Bark() {//子类重写父类方法
            Console.WriteLine("dog");
        }
        public void TextFunction() {
            Console.WriteLine("测试方法");
        }
    }
    class Pig : animal {
        public override void Bark() {//子类重写父类方法
            Console.WriteLine("pig");
        }
        public void TextFunction() {
            Console.WriteLine("测试方法");
        }
    }
}

虚方法类的继承

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

namespace 虚方法类的继承 {
    class Program {
        static void Main(string[] args) {
            person[] per = { new Liuguan(), new Wangming() };
            foreach(person item in per) {
                item.Function();
            }
            Console.ReadLine();
        }
    }
    class person {
        public virtual void Function() {//虚方法
            Console.WriteLine("我是人");
        }
    }
    class Liuguan : person {
        public override void Function() {
            //  base.Function();
            Console.WriteLine("我是刘冠");
        }
    }
    class Wangming : person {
        public override void Function() {
            //  base.Function();
            Console.WriteLine("我是王明");
        }
    }
    
}

 

posted @ 2017-01-02 20:43  刘冠  阅读(214)  评论(0编辑  收藏  举报