说明
接口可以包含方法、属性、索引器、和事件作为成员,但是并不能设置这些成员的具体值。也就是说,只能定义,不能那个给他里面定义的东西赋值。
接口具有以下特性。
- 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
- 不能直接实例化接口。
- 接口可以包含事件、索引器、方法和属性。
- 接口不包含方法的实现。
- 类和结构可从多个接口继承。
- 接口自身可从多个接口继承。
c#中声明接口时,使用interface关键字
修饰符 interface 接口名称:继承的接口列表
{
接口内容;
}
说明
1.声明接口时,除interface关键字和接口名称外,其他都是可选项。
2.可以使用new、public、protected、internal和private等修饰符声明接口,但接口成员必须是公共的。
常见的访问修饰符有:
(1)public 公有访问。不受任何限制。
(2)private 私有访问。只限于本类成员访问,子类。
(3)protected 保护访问。只限于本类和子类访问。
(4)internal 内部访问。只限于本项目内访问,其他不能访问。
(5)protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问
接口的实现与继承
接口定义:
interface Imyinterface//再三强调,接口中只能声明,不能给定义赋值
{
string ID
{
get;
set;
}
string Name
{
get;
set;
}
void ShowInfo();//不能给函数写任何内容
}
class program:Imyinterface//program类继承接口,需要对接口里的内容全部进行定义,否则编译就会不通过
{
private string id = "";
private string name = "";
public string ID
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public void ShowInfo()
{
Console.WriteLine("编号\t 姓名");
Console.WriteLine(ID+"\t"+Name);
}
}
主函数:
static void Main(string[] args)
{
program p = new program();//这里是实例化program类对象
p.ID = "TM";
p.Name = "C#3.5从入门到应用开发";
p.ShowInfo();
Imyinterface mf = p;//使用派生类对象实例化接口Imyinterface
mf.ID = "MCK";//为派生类中的ID属性赋值
mf.Name = "2018";//为派生类中的Name属性赋值
mf.ShowInfo();//调用派生类中的函数
}
运行结果:
编号 姓名
TM C#3.5从入门到应用开发
MCK 2018
上面的实例中只继承了一个接口,接口还可以多重继承,使用多重继承时,要继承的接口间用逗号(,)分隔。
- 例:我声明了3个接口IPeople、ITeacher、IStudent,其中ITeacher、IStudent继承自IPeople。然后使用Program类继承这三个接口。
接口声明:
interface IPeople
{
string Name
{ get; set; }
string Sex
{ get; set; }
}
interface IStudent:IPeople
{
void study();
}
interface ITeacher:IPeople
{
void teach();
}
class program:IPeople,IStudent,ITeacher
{
private string name = "";
private string sex = "";
public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set { sex = value; }
}
public void teach()
{
Console.WriteLine(Name+" "+Sex+" 老师");
}
public void study()
{
Console.WriteLine(Name+" "+Sex+" 学生");
}
}
主函数:
static void Main(string[] args)
{
program pg = new program();
ITeacher it = pg;
it.Name = "mck";
it.Sex = "man";
it.teach();
IStudent ist= pg;
ist.Name = "mck";
ist.Sex = "man";
ist.study();
}
运行结果:
mck man 老师
mck man 学生
显式接口成员实现
显式接口成员实现是使用接口名称和一个句点命名该类成员实现的。
interface IPeople
{
string Name
{ get; set; }
string Sex
{ get; set; }
}
interface IStudent:IPeople
{
void study();
}
interface ITeacher:IPeople
{
void teach();
void study();
}
class program:IPeople,IStudent,ITeacher
{
private string name = "";
private string sex = "";
public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set { sex = value; }
}
public void teach()
{
Console.WriteLine(Name+" "+Sex+" 老师");
}
void IStudent.study()//显式接口方法,只能是ISudentd的对象使用
{
Console.WriteLine(Name+" "+Sex+" 学生学习");
}
void ITeacher.study()//显式接口方法,只能是ITeacher的对象使用
{
Console.WriteLine(Name + " " + Sex + " 老师学习");
}
}
static void Main(string[] args)
{
program pg = new program();//实例化接口继承类的对象
ITeacher it = pg;//使用接口继承类的对象实例化接口
it.Name = "mck";
it.Sex = "man";
it.teach();
it.study();
IStudent ist= pg;//使用接口继承类的对象实例化接口
ist.Name = "mck";
ist.Sex = "man";
ist.study();
}
注意
1.显式接口成员实现中不能包含访问修饰符、abstract、virtual、override或static修饰符。
2.显式接口成员属于接口的成员,而不是类的成员,因此,不能使用类的对象直接访问,只能通过接口对象访问。
抽象类和抽象方法
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类。在抽象类中声明方法时,如果加上abstract关键字,则为抽象方法。
抽象类的概述及声明
抽象类和非抽象类的区别:
- 抽象类不能直接实例化。
- 抽象类中可以包含抽象成员,但非抽象类中不可以。
- 抽象类不能被密封。
访问修饰符 abstract class myclass
{
public int i;
public void method()
{}
}
抽象方法概述及声明
抽象方法就是在声明方法时,加上abstract关键字,声明抽象方法时需要注意:
- 抽象方法必须声明在抽象类中。
- 声明抽象方法时,不能使用virtual、static和private修饰符。
抽象方法不提供任何实际实现,因此抽象方法的方法体只包含一个分号;
当从抽象类派生一个非抽象类时,需要在非抽象类中重写抽象的方法,以提供具体实现,重写抽象方法时使用override关键字。
例:声明一个抽象类,里面有一个抽象方法
public abstract class myclass
{
public abstract void method();//抽象方法
}