黑马程序员技术交流社区

标题: 用接口实现多态 [打印本页]

作者: 如远行客    时间: 2013-12-19 11:49
标题: 用接口实现多态
本帖最后由 如远行客 于 2013-12-19 11:54 编辑

用接口实现多态
接口是完全抽象的一种约定,在C#语言中,接口是声明类具有的方法和成员的的、自身不能被实例化的、只能被继承的特殊类。接口和抽象类的区别是:接口是对一种特定的方法或者一类特定的能力所做的一种抽象,而抽象类是对一类对象的抽象。接口的特点如下:
◆  接口就是用来实现的,但是接口里面不包含方法的实现体。
◆  继承接口的任何非抽象类型都必须实现接口的所有成员。
◆  类和结构可以从多个接口继承。
◆  接口自身也可以从多个接口继承。
◆  一个接口可由多个类来实现,,而一个类也可以实现多个接口。
◆  接口的所有成员默认访问级别为public。
◆  接口成员只有方法、属性、索引和事件等声明。
接口的声明语法个如下:
         [访问修饰符] interface 接口名 [:父接口列表]
         {
                   //接口成员定义体
      }
其中,访问修饰符可以是new、public、protected、internal和private。new修饰符是在嵌套接口中唯一被允许的修饰符,表示用相同的名称隐藏一个继承的成员。
类可以通过其继承的基类或接口多次继承某个接口。在这种情况下,如果将该接口声明为新类的一部分,则类只能实现该接口一次。如果没有将接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员,在这种情况下,集成接口的类课可通过重写虚拟成员来更改接口行为。
例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 接口
{
    class Program
    {
        static void Main(string[] args)
        {
           IWalk[] walkObj={new Person(),
                              new Student(),
                              new Child(),
                              new Cat(),
                              new Bicycle()
                             };
           foreach (IWalkitem in walkObj)
           {
               item.Walk();    //这一个方法实现了多态
           }
           Console.WriteLine("=================================");
           ISound[] soundObj = {new Person(),
                                 new Student(),
                                 new Child(),
                                 new Cat(),
                                 new Radio()
                                };
           foreach (ISounditem in soundObj)
           {
               item.Sound();
           }
           Console.ReadKey();
        }
    }
    interface IWalk     //定义行走方法的接口
    {
        void Walk();
    }
    interface ISound    //定义发声方法的接口
    {
        void Sound();
    }
    abstract class Animal:IWalk,ISound  //继承两个接口表示Animal类有这两个方法
    {
        public abstract void Walk();
        public abstract void Sound();
    }
    class Person:Animal
    {
        public override void Walk()
        {
           Console.WriteLine("我是人,用两条腿走路! ");
        }
        public override void Sound()
        {
           Console.WriteLine("我会用人的语言说话!!! ");
        }
    }
    class Student: Person
    {
        public sealed override voidWalk()  //用sealed修饰表示禁止Student子类重写该方法
        {
           Console.WriteLine("我是学生,这是我重写的走路方法~~~");
        }
        public override void Sound()
        {
           Console.WriteLine("我是学生,这是我重写的发声方法^_^");
        }
    }
    class Child : Student
    {
        public override void Sound()
        {
           Console.WriteLine("我是小孩,我的声音很好听哦0_0");
        }
        public voidWalk()  //Student中的Walk不能被重写
        {
           //此处未定义方法体,则会继承Student类对应的方法体
        }
    }
    class Cat:Animal   
    {
        public override void Walk()
        {
           Console.WriteLine("我是猫,我走猫步@_@");
        }
        public override void Sound()
        {
           Console.WriteLine("我是猫,喵喵喵~~~");
        }
    }
    class Bicycle:IWalk //自行车只有移动的能力,只继承移动的接口
    {
        public void Walk()
        {
           Console.WriteLine("我是自行车,我会移动哦……");
        }
    }
    class Radio : ISound    //收音机只有发声的能力,只继承发声的接口
    {
        public void Sound()
        {
           Console.WriteLine("小喇叭又开始广播啦!!! ");
        }
    }
}
程序运行结果如下:

接口1.PNG (47.26 KB, 下载次数: 49)

接口1.PNG

作者: V_John    时间: 2013-12-20 21:05
大家的笔记不要写在这里哦,把比较好的资源,好的学习资料分享出来,肯定不错的
作者: 许庭洲    时间: 2013-12-21 09:50
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2