---------------------- 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.youkuaiyun.com" target="blank">http://edu.youkuaiyun.com </a>