本人也是参考网上列子。运行起来有点问题,重新理解并实践过。以下代码是在控制台编写,是可运行的。
需求:公司有两个人分别写了2个动物吃什么(可通过写两个动物类实现需求)
//新建Dog类
public class Dog { public void likeFood() { Console.WriteLine("喜欢吃肉"); } }
//新建Cat类
public class Cat { public void likeFood() { Console.WriteLine("喜欢吃鱼"); } }
//动物园类 public class Zoo { public void show(Dog dog){ dog.likeFood(); } public void show(Cat cat){ cat.likeFood(); } }
//控制台输出:
//喜欢吃肉
//喜欢吃鱼
Zoo zoo = new Zoo(); zoo.show(new Dog()); //喜欢吃肉 zoo.show(new Cat()); //喜欢吃鱼
需求发生变化时,需要多添加猴子喜欢吃什么的(按照简单理解,我们可以通过添加MonKey类添加likeFood()方法,并在zoo类中实例化MonKey类得到猴子喜欢吃什么
,然后得到猴子喜欢吃什么。需要修改3个地方就过于有点繁琐。这里就可用到继承和多态)
//新建基类(父类)
public class Animal { public virtual void likeFood()//声明个虚方法
{ Console.WriteLine("我是基类"); } }
//新建Dog类
public class Dog:Animal { public override void likeFood()//重写基类likeFood()方法 { Console.WriteLine("喜欢吃鱼"); } }
//新建Cat类
public class Cat:Animal { public override void likeFood()//重写基类likeFood()方法 { Console.WriteLine("喜欢吃鱼"); } }
//新建Monkey类
public class Cat:Animal { public override void likeFood()//重写基类likeFood()方法 { Console.WriteLine("喜欢吃香蕉"); } }
//动物园类 public class Zoo { public void show(Animal animal){ animal.likeFood(); } }
//控制台输出:
//喜欢吃肉
//喜欢吃鱼
//喜欢吃香蕉
Zoo zoo = new Zoo(); zoo.show(new Dog()); //喜欢吃肉 zoo.show(new Cat()); //喜欢吃鱼
zoo.show(new Monkey());//喜欢吃香蕉
这种类似的需求再发生时,就不需要修改zoo类里内容了。只需新建个继承Animal类的派生类。就可在控制台直接实例化zoo类得到想要的动物类的结果。在重写基类方法时,
不会出现新人声明类方法和你方法名称不统一的情况(重写方法名时,方法名称不对会无法编译的)