接口和抽象类关系很紧密,它们都具有对成员的抽象。
对于一个抽象类,至少一个方法是抽象方法既可,这意味着它也可以具有具体方法[译注:Concrete Method,这只是相对于抽象方法而言,面向对象中并没有这个概念]。
对于一个接口,所有的方法必须都是抽象的。
实现了一个接口的类必须为接口中的所有方法提供具体的实现,否则只能声明为抽象类。
在C#中,多重继承(Multiple Inheritance)只能通过实现多个接口得到。抽象类只能单继承[注:C#中的单继承是指所有类作为基类的时候都只能是派生类声明中唯一的基类,而不仅仅是抽象类]。
接口定义的是一个契约,其中只能包含四种实体,即方法、属性、事件和索引器。因此接口不能包含常数(Constant)、域、操作符、构造器、析构器、静态构造器或类型[译注:指嵌套的类型]。
同时,一个接口还不能包含任何类型的静态成员。修饰符abstract、public、protected、internal、private、virtual、override都是不允许出现的,因为它们在这种环境中是没有意义的。
类中实现的接口成员必须具有公有的可访问性。
对于一个抽象类,至少一个方法是抽象方法既可,这意味着它也可以具有具体方法[译注:Concrete Method,这只是相对于抽象方法而言,面向对象中并没有这个概念]。
对于一个接口,所有的方法必须都是抽象的。
实现了一个接口的类必须为接口中的所有方法提供具体的实现,否则只能声明为抽象类。
在C#中,多重继承(Multiple Inheritance)只能通过实现多个接口得到。抽象类只能单继承[注:C#中的单继承是指所有类作为基类的时候都只能是派生类声明中唯一的基类,而不仅仅是抽象类]。
接口定义的是一个契约,其中只能包含四种实体,即方法、属性、事件和索引器。因此接口不能包含常数(Constant)、域、操作符、构造器、析构器、静态构造器或类型[译注:指嵌套的类型]。
同时,一个接口还不能包含任何类型的静态成员。修饰符abstract、public、protected、internal、private、virtual、override都是不允许出现的,因为它们在这种环境中是没有意义的。
类中实现的接口成员必须具有公有的可访问性。
举个最
简单
例子吧.假如有个构建SQL语句的类.它有一个方法获得任意字符通配符.为此,我们写个抽象类:
public abstract class DbFactoryBase
{
//默认实现,通配符
public virtual string GetMultiLikeChar()
{
return "%";
}
}
//我们写MSSQL的实现
public class SqlSvrFactory:DbFactoryBase
{
//GetMultiLikeChar方法不需要重载
}
//我们写Jet的实现
public class JetFactory:DbFactoryBase
{
//重载,通配符
public override string GetMultiLikeChar()
{
return "*";
}
}
好处是显而易见的,抽象类提供了默认实现,子类只在需要更改的时候才重载这个方法,我们这个类可以很容易扩展,比如增加对ORACLE的实现,调用这个抽象类的代码也不需要改变,但返回来的字符已经不同了.代码看上去也更简洁...等等.这只是冰山之一角.建议多看看模式之类的书.
public abstract class DbFactoryBase
{
//默认实现,通配符
public virtual string GetMultiLikeChar()
{
return "%";
}
}
//我们写MSSQL的实现
public class SqlSvrFactory:DbFactoryBase
{
//GetMultiLikeChar方法不需要重载
}
//我们写Jet的实现
public class JetFactory:DbFactoryBase
{
//重载,通配符
public override string GetMultiLikeChar()
{
return "*";
}
}
好处是显而易见的,抽象类提供了默认实现,子类只在需要更改的时候才重载这个方法,我们这个类可以很容易扩展,比如增加对ORACLE的实现,调用这个抽象类的代码也不需要改变,但返回来的字符已经不同了.代码看上去也更简洁...等等.这只是冰山之一角.建议多看看模式之类的书.