接口
- 接口:一种约束,实现接口的类或者结构必须遵守该约定。
- 声明:用interface 关键字声明。接口能声明方法、属性、索引器和事件,但是不能实现它们。
- 泛型接口和非泛型接口:
泛型接口演示,泛型接口可以让方法普适性更强。
interface ICompare<T>
{
bool Compare(T obj);
}
public class Student : ICompare<Student>
{
public int marks;
public string name;
public bool Compare(Student stu)
{
return this.marks > stu.marks;
}
}
- 接口的显式实现和隐式实现:
接口的隐式实现:实现接口的方法直接写名称。接口和类都可以访问。
namespace Blog1
{
interface ITest
{
void Test();
}
public class One : ITest
{
public void Test()
{
Console.WriteLine("这只是一个测试");
}
}
class Program
{
static void Main(string[] args)
{
//隐示实现:接口和类都可以访问
ITest a = new One();
a.Test();
One b = new One();
b.Test();
Console.ReadKey();
}
}
}
/*输出:
这只是一个测试
这只是一个测试
*/
接口的显式实现:实现接口的方法用“接口.方法名字”,只有接口可以访问。
namespace Blog1
{
interface ITest
{
void Test();
}
public class One : ITest
{
public void ITest.Test()
{
Console.WriteLine("这只是一个测试");
}
}
class Program
{
static void Main(string[] args)
{
//显示实现:只有接口可以访问
ITest a = new One();
a.Test();
One b = new One();
Console.ReadKey();
}
}
}
/*输出:
这只是一个测试
*/
区别:
- 隐示实现:接口和类都可以访问
- 显示实现:只有接口可以访问
显示实现的好处:
- 隐藏代码的实现
- 在使用接口访问的系统中,调用者只能通过接口调用而不是底层的类来访问
- 注意:
- 接口方法名字通常接口命令以 I 字母开头。
- 接口声明默认是 public 的。
- 接口的成员是隐式public的,不允许有任何访问修饰符,包括public。
- 接口声明可以用六个访问级别声明,但是在命名空间里面声音只能public。
- 牛客做了一道题,答案是接口可以声明方法、属性、索引器和事件。但是属性、索引器和事件的实质都是方法:属性实质是由{get;set;}两个方法组成;索引器其实就是一个属性;事件本身即为方法。
interface ITest<T>
{
//属性
int Num
{
get;
set;
}
//索引器
string this[int index]
{
get;
set;
}
//事件
event EventHandler TestEvent;
//泛型
bool Test(T obj);
}
抽象类
- 抽象类:通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。
- 声明:用abstract关键字声明。抽象类里可以包含两种抽象成员,分别是抽象方法声明和抽象属性,同时可以包含其他非抽象成员。
public abstract class BallGame
{
//属性
public abstract string name { get; }
//方法
public abstract void GetGround();
}
public class Basketball : BallGame
{
public override string name
{
get
{
return "篮球";
}
}
public override void GetGround()
{
Console.WriteLine("篮球场");
}
}
- 注意:
- 抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。
- 抽象类的派生类必须实现所有抽象方法。
- 当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。继承抽象方法的类无法访问方法的原始实现。
接口和抽象类的同异
同:
- Sealed都不能修饰接口和抽象类。
- 都体现了多态性。
- 抽象类的抽象方法、属性、接口的方法都需要靠继承来实现。
异:
- 接口可以多重继承,而抽象类只能单一继承。
- 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,不过可以修改为虚方法。
- 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段(成员变量)。
- 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
- 接口着重于Can—Do关系类型,抽象类则偏重于IS—A式关系。
- 接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。关于接口可以作用于值类型,struct是值类型,只可以继承接口。