接口:描述可属于任何类或结构的一组相关功能,通过interface关键字来声明;
接口只包含方法、委托或事件和属性的签名(接口包含的成员)、不能包含字段(因为字段是包含数据的)。方法的实现是“继承”接口的类中完成的;
接口可以包含的成员的访问修饰符只能且默认为public;
一个接口可以从一个或多个基接口继承;
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员;
当基类型列表包含基类和接口时,基类必须是列表中的第一项;
实现接口的类可以显式实现该接口的成员,显示实现的成员不能通过类实例访问,而只能通过接口实例访问;
类和结构可以按照类继承基类或结构的类似方式继承接口;但注意:
类或结构可继承多个接口;
类或结构继承接口时,仅继承方法名称和签名,因为接口本身不包含实现;
接口和接口成员是抽象的(但不用写出abstract关键字);接口不提供默认实现;
接口只包含方法、委托或事件和属性的签名(接口包含的成员)、不能包含字段(因为字段是包含数据的)。方法的实现是“继承”接口的类中完成的;
接口可以包含的成员的访问修饰符只能且默认为public;
一个接口可以从一个或多个基接口继承;
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员;
当基类型列表包含基类和接口时,基类必须是列表中的第一项;
实现接口的类可以显式实现该接口的成员,显示实现的成员不能通过类实例访问,而只能通过接口实例访问;
类和结构可以按照类继承基类或结构的类似方式继承接口;但注意:
类或结构可继承多个接口;
类或结构继承接口时,仅继承方法名称和签名,因为接口本身不包含实现;
接口和接口成员是抽象的(但不用写出abstract关键字);接口不提供默认实现;
接口是一种规划(为你定义出一系列的规则和任务,但不去实现它)
下面的例子很好的说明了这点:
interface IMyInt//定义一个接口:通讯工具的接口
{
string Name//包含只读字段的通讯工具名属性
{
get;
}
string Number//通讯工具的号码属性
{
get;
set;
}
}
public class Tel : IMyInt//固定电话类型
{
string name = "固定电话";
string number;
//对接口中Name和Number的实现
public string Name
{
get { return name; }
}
public string Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
public class Phone : IMyInt//移动电话类型
{
string name = "移动电话";
string number;
public string Name
{
get { return name; }
}
public string Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
public class Fax : IMyInt//传真机类型
{
下面的例子很好的说明了这点:
interface IMyInt//定义一个接口:通讯工具的接口
{
string Name//包含只读字段的通讯工具名属性
{
get;
}
string Number//通讯工具的号码属性
{
get;
set;
}
}
public class Tel : IMyInt//固定电话类型
{
string name = "固定电话";
string number;
//对接口中Name和Number的实现
public string Name
{
get { return name; }
}
public string Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
public class Phone : IMyInt//移动电话类型
{
string name = "移动电话";
string number;
public string Name
{
get { return name; }
}
public string Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
public class Fax : IMyInt//传真机类型
{
string name = "传真机";
string number;
public string Name
{
get { return name; }
}
public string Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
public class Program
{
static List<IMyInt> list = new List<IMyInt>();//存放IMyInt接口的列表集合;
static string select = " ";//选择变量
static void AddNum(IMyInt myint)//添加号码的方法;注意:此处参数的类型是IMyInt,这样无论添加的是Tel、Phone、Fax类型, //都可以向list里面添加;即:好型接口提供了一个模糊的模型,满足这个模型的继承了这个接 //口的类型都可以作为参数;
{
list.Add(myint);
}
static void Main()//程序的入口点Main
{
for (int i = 0; i < 3; i++)
{
string num = "";
Console.WriteLine("1、Fax");
Console.WriteLine("2、Phone");
Console.WriteLine("3、Tel");
select = Console.ReadLine();
Console.Write("输入添加的号码");
if (select == "1")
{
Fax f = new Fax();
num = Console.ReadLine();
f.Number = num;
AddNum(f);//AddNum方法的调用
}
if (select == "2")
{
Phone p = new Phone();
num = Console.ReadLine();
p.Number = num;
AddNum(p);
}
if (select == "3")
{
Tel t = new Tel();
num = Console.ReadLine();
t.Number = num;
AddNum(t);
}
}
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("name:{0};number:{1}", list[i].Name, list[i].Number);
}
Console.ReadLine();
}
}
string number;
public string Name
{
get { return name; }
}
public string Number
{
get
{
return number;
}
set
{
number = value;
}
}
}
public class Program
{
static List<IMyInt> list = new List<IMyInt>();//存放IMyInt接口的列表集合;
static string select = " ";//选择变量
static void AddNum(IMyInt myint)//添加号码的方法;注意:此处参数的类型是IMyInt,这样无论添加的是Tel、Phone、Fax类型, //都可以向list里面添加;即:好型接口提供了一个模糊的模型,满足这个模型的继承了这个接 //口的类型都可以作为参数;
{
list.Add(myint);
}
static void Main()//程序的入口点Main
{
for (int i = 0; i < 3; i++)
{
string num = "";
Console.WriteLine("1、Fax");
Console.WriteLine("2、Phone");
Console.WriteLine("3、Tel");
select = Console.ReadLine();
Console.Write("输入添加的号码");
if (select == "1")
{
Fax f = new Fax();
num = Console.ReadLine();
f.Number = num;
AddNum(f);//AddNum方法的调用
}
if (select == "2")
{
Phone p = new Phone();
num = Console.ReadLine();
p.Number = num;
AddNum(p);
}
if (select == "3")
{
Tel t = new Tel();
num = Console.ReadLine();
t.Number = num;
AddNum(t);
}
}
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("name:{0};number:{1}", list[i].Name, list[i].Number);
}
Console.ReadLine();
}
}