黑马程序员---面向对象之接口2

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

博客园:http://www.cnblogs.com/piziyimao/archive/2013/01/28/2880625.html#_labelStart

a、声明可以飞的接口

namespace 接口 {
    interface IFlyable {//接口命名规范 大写I开头  接口可以有访问修饰符 它和类一样
        //public void Fly();//定义在接口中的方法不能有访问修饰符
        void Fly();//默认隐式公开 默认Public 接口中成员不能有实现
        //private string name;//接口中可以有方法 属性 索引器 但不能有字段
        string Name {
            get;//可以有属性 但不能有实现 所以下面一个是错的
        }
        //string Name {
        //    get {
        //        return null;
        //    }//不能有实现
        //}
        void Samename();
    }
}

b、声明可以说话的接口

namespace 接口 {
    interface ISpeak {
        void Speak();
        void Samename();
    }
}

c、实现接口

using System;
namespace 接口 {
    class Test : IFlyable {//实现接口
        public void Fly() {
            Console.WriteLine("实现接口中未实现的成员" );
        }
        public string Name {
            get {
                throw new NotImplementedException();
            }
        }
    }
}

d、添加父类Bird.cs 

namespace 接口 {
    class Bird {
        private string name;
        public string Name {
            get {
                return name;
            }
            set {
                name = value ;
            }
        }
    }
}

e、Test类实现接口并继承Bird类

using System;
namespace 接口 {
    /// <summary>
    /// 实现接口
    /// </summary>
    class Test : Bird , IFlyable { //IFlyable, Bird 继承的父类Bird必须在IFlyable接口前
        public void Fly() {
            Console.WriteLine("实现接口中未实现的成员" );
        }
        public string Name {
            get {
                throw new NotImplementedException();
            }
        }
        void IFlyable .Samename() {
            throw new NotImplementedException();
        }
    }
}

f、鹦鹉类继承Bird   实现IFlyable,ISpeak接口

using System;
namespace 接口 {
    class Sparrow : Bird , IFlyable, ISpeak {//显示实现接口 当前类实现两个接口时 接口中存在同名的方法 此时需要显示实现 很少用
        public void Fly() {
            throw new NotImplementedException();
        }
        //鹦鹉不仅能飞还能说话 那必须添加Speak的接口
        public void Speak() {
            Console.WriteLine("不能在IFlyable接口中定义Speak功能 而需另建Speak接口" );
        }
        string IFlyable .Name {
            get {
                throw new NotImplementedException();
            }
        }
        //显示实现接口时 方法名称前多了接口名称
        void IFlyable .Samename() {
            throw new NotImplementedException();
        }
        //IFlyable与ISpeak存在同名的Samename方法
        void ISpeak .Samename() {//不可以添加Public访问修饰符
            throw new NotImplementedException();
        }
    }
}

g、接口的调用

namespace 接口 {
    class Program {
        static void Main(string[] args) {
            //接口可以看做是父类  不能new IFlyable();
            //IFlyable fly = new Test();
            IFlyable[] flys = {//作为父类一样使用
                            new Test (),
                            new Sparrow ()
                            };
            foreach(IFlyable item in flys) {
                //item.Fly();
                item.Samename();
                if(item is Sparrow) {
                    var a = item as Sparrow;
                    if(a != null ) {
                        a.Speak(); //如果直接转换((Sparrow)item).Speak(); 值为null的话 会直接报错
                        //a.Samename();//当Sparrow类显示实现Samename时  就不能再通过对象.方法()调用
                    }
                }
            }
        }
    }
}
接口练习

 

接口练习

//从学生,老师,校长类中抽象出人的类,学生和老师都有收作业的方法,但是校长不会收作业

a、新建Person父类

namespace 接口练习 {
    class Person {
        private string name;
        public string Name {
            get {
                return name;
            }
            set {
                name = value;
            }
        }
        private string sex;
        public string Sex {
            get {
                return sex;
            }
            set {
                sex = value;
            }
        }
        public Person() {
        }
        public Person(string name, string sex) {
            this.sex = sex;
            this.name = name;
        }
    }

}


b、新建交作业的接口

namespace 接口练习 {
    interface ICollectHomeWork {
        void CollectHomeWork();
    }
}

c、新建老师类和学生类继承自Person类,实现ICollectHomeWork接口

using System;
namespace 接口练习 {
    class Student : Person , ICollectHomeWork {
        public void CollectHomeWork() {
            Console.WriteLine("收作业" );
        }
        public Student(string name, string sex)
            : base(name, sex) {
        }
        public Student() {
        }
    }
}
  
using System;
namespace 接口练习 {
    class Teacher : Person , ICollectHomeWork {
        public Teacher() {
        }
        public void CollectHomeWork() {
            Console.WriteLine("该交作业了" );
        }
        public Teacher(string name, string sex)
            : base(name, sex) {
        }
    }
}

d、新建校长类继承Person类

namespace 接口练习 {
    class SchoolMaster : Person {
        public SchoolMaster(string name, string sex)
            : base(name, sex) {
        }
    }
}

e、调用接口

namespace 接口练习 {
    class Program {
        static void Main(string[] args) {
            Collect( new Teacher ());
            Create( "student").CollectHomeWork();//Create("student")就是接口的对象
        }
        //将收作业定义成为方法
        static void Collect(ICollectHomeWork homework) { //接口作为参数
            homework.CollectHomeWork();
        }
        static ICollectHomeWork Create(string type) { //接口作为返回值 ICollectHomeWork接口本身就是种数据类型  引用类型
            ICollectHomeWork ico = null ;
            switch(type) {
                case "teacher" :
                    ico = new Teacher ();
                    break;
                case "student" :
                    ico = new Student ();
                    break;
                default:
                    break;
            }
            return ico;
        }
    }
}

 

总结:

接口

  接口是定义类的一组标准和规范

  接口的出现是为了解决类的单根继承性

  接口不能被实例化

  可以同时实现多个接口,如果同时继承类和实现接口,类必须在最前

  接口可以继承接口

  接口中的成员不可以加访问修饰符,隐式为public

  接口中的成员不能有实现

  接口中的所有成员必须在子类中去直接实现

  接口中可以包含属性、方法,但不能包含字段,构造函数

  接口提供能力

  接口污染,一个接口只做一件事情

  interface IFlyable

  {

    void Fly();

    void Speak();

  }

接口和抽象类

  抽象类中可以有实现而接口中不能有实现

  抽象类和接口都不能被实例化

  接口的成员在子类中直接实现,抽象类中的抽象成员要重写override

什么时候使用抽象类,什么时候使用接口

  抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

  飞机会飞,鸟会飞,他们都实现了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

 
详细请查看:<ahref="http://edu.csdn.net" target="blank">http://edu.csdn.net </a>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值