步步为营-04-一个通过接口实现多态的经典例子

说明:涉及到继承,抽象类,虚方法,接口等知识点

鸟类都有翅膀,

鸟类都会吃,但吃的食物不一样

鸟类都会叫,虽然叫声不一样,喜鹊,燕子,麻雀,感觉都是叽叽喳喳的.程序员中的世界就是讲儿.

鸟类中,麻雀会飞,喜鹊会飞和鸵鸟不会飞

鸟类中,麻雀,喜鹊都是"叽叽喳喳"的叫,鸵鸟"哦哦"(当然我没有听过,也懒得去查,主要矛盾于次要矛盾)

另外飞机也会飞

定义一个父类-鸟类(属性:翅膀;方法:吃;虚方法:叫声)

定义一种能力(接口IFlyable)

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

namespace Bird
{
   public  interface IFly
    {
       void Fly();
    }
}

IFly

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

namespace Bird
{
    public abstract class Bird
    {
        //定义字段--翅膀
        private string wing;
        //根据字段生成属性
        public abstract string Wing
        {
            set;
            get;
        }
        //定义抽象方法--吃
        public abstract void Eat();
        //定义虚方法
        public virtual void Sing() {
            Console.WriteLine("叽叽渣渣");
        }

    }
}

Bird

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

namespace Bird
{
   public class Sparrow:Bird,IFly
    {
        public override void Eat()
        {
            Console.WriteLine("我是麻雀,我爱吃人类的粮食");
        }

        public void Fly()
        {
            Console.WriteLine("我会飞");
        }
        private string wing;
        public override string Wing
        {
            get
            {
                return wing;
            }
            set
            {
                wing = "麻雀的翅膀";
            }
        }
    }
}

Sparrow

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

namespace Bird
{
    class Ostrich:Bird
    {
        private string wing;

        public override string Wing
        {
            get
            {
                return wing;
            }
            set
            {
                wing = "鸵鸟的翅膀";
            }
        }

        public override void Eat()
        {
            Console.WriteLine("我是鸵鸟,我吃人");

        }

        public override void Sing()
        {
            Console.WriteLine("哦!哦!");
        }
    }
}

Ostrich

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

namespace Bird
{
    public class Pie:Bird,IFly
    {
        private string wing;
        public override string Wing
        {
            get
            {
                return wing;
            }
            set
            {
                wing = "xique的翅膀";
            }
        }

        public override void Eat()
        {
            Console.WriteLine("我是喜鹊,谷类和虫子");
        }

        public void Fly()
        {
            Console.WriteLine("我是喜鹊,我会飞!");
        }
    }
}

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

namespace Bird
{
    class Program
    {
        static void Main(string[] args)
        {
            Bird[] birds = { new Sparrow (),new Ostrich(),new Pie()};
            foreach (Bird item in birds)
            {
                Console.WriteLine(item.Wing);
                item.Eat();
                item.Sing();
            }
           Sparrow sp =  new Sparrow ();
           Pie p = new Pie();
           sp.Fly();
           p.Fly();
           Console.Read();
        }
    }
}

Main

时间: 2024-10-24 19:32:27

步步为营-04-一个通过接口实现多态的经典例子的相关文章

No2_4.接口继承多态_Java学习笔记_经典案例

1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.List; 4 5 /** 6 * @title 接口继承多态的经典范例 7 * @author 作者:sunshine yaqingl 8 * @date 创建时间:2016年7月6日 下午5:27:39 9 */ 10 11 //使用Comparable接口自定义排序 12 class Employee implements Com

【转 】C#中的接口实现多态

C#中的接口实现多态 我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态 1.首先我们先要来了解了解什么是接口,它存在的意识 01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 02.接口可以实现多继承,弥补单继承的缺陷.  03.接口可以看成是一个特殊的抽象类,通过反编译看源码可知 04.接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体 05.如果一个类实现了某个接口,就得实现该接口中所有的方法 06.接口要谨慎使用,防止出现接口污染!

C#中的接口实现多态

我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态 1.首先我们先要来了解了解什么是接口,它存在的意识 01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 02.接口可以实现多继承,弥补单继承的缺陷.  03.接口可以看成是一个特殊的抽象类,通过反编译看源码可知 04.接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体 05.如果一个类实现了某个接口,就得实现该接口中所有的方法 06.接口要谨慎使用,防止出现接口污染! 07.接口仅仅代表一种

11_Java面向对象_第11天(接口、多态)

今日内容介绍1.接口2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的 实现类(相当于接口的子类)来完成.这样将功能的定义与实现分离,优化了程序设计. 请记住:一切事物均有功能,即一切事物均有接口. 02接口的定义 A: 接口的定义 与定义类的class不同,接口定义时需要使用interface关键字. 定义接口所在的仍为.java文件,虽然声明时使用的为inter

day03(接口,多态)

接口:            概念:是功能的集合,可以当做引用数据类型的一种.比抽象类更加抽象. 接口的成员:               成员变量:必须使用final修饰 默认被 public & static & final修饰 不允许修改 成员方法:必须是抽象方法 默认是抽象方法 创建方法时可以省略.(开发时建议写上,好辨识)              构造方法:没有 public interface Inter01 { public static final int NUM=10;

java基础2:抽象类、接口与多态

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

抽象类和抽象方法接口和多态

抽象类与普通类的区别: 1.抽象类中可以写抽象方法,普通类不可以: 2.抽象类不能直接创建对象,普通类可以: 3.抽象类中可以没有抽象方法,但是仍然不能创建对象. 抽象类的常见问题 1.抽象类一定是父类,因为是不断向上抽取而来. 2.实际开发中,建议先写抽象的父类,在根据具体的子类编写功能. 3.有抽象方法的类一定是抽象类,在抽象类中,可以没有抽象方法. 没有抽象方法的类是一种特殊的设计模式:(适配器模式) 4.如果抽象A定义了一个抽象的a方法,如果B类继承A的时候,没有重写a方法,B类也必须抽

接口和多态

子类  继承 父类 实现类  接口 (多态) 为什么要用接口引用指向实现类的对象 List list;是在栈区开辟一个空间放list引用,并没有创建对象所以不知道ArrayList还是LinkedList当你list= new ArrayList(); 就创建了ArrayList对象.并且把开始创建的list引用指向这个对象ArrayList和LinkedList都是List的实现类. 为什么一般都使用 List list = new ArrayList() ,而不用 ArrayList ali

面向对象,封装,构造方法,this关键字,main,继承,接口,多态阶段性小结

一.局部变量和成员变量 成员变量:  定义在类中变量 局部变量:  定义在方法中变量 1成员变量与局部变量的区别: 应用范围 成员变量在整个类内都有效 局部变量只在其声明的方法内有效 生命周期   成员变量: 它属于对象,它随着对象的创建而创建,随着对象的消失而消失 局部变量: 使用完马上释放空间. 存储位置  成员变量属于对象,它存储在堆内,堆内的实体,当没有引用指向其时,才垃圾回收清理 局部变量存在栈内存中,当不在使用时,马上就会被释放. 初始值 成员变量它存储在堆中,如果没有赋初值,它有默