1.抽象类是“定义”(例如什么是人),接口是规范类(人的种类,如黑人白人)。即抽象类是通过分析实体类的联系得到的,而接口则是规范,实体类必须来实现这个接口的方法。
2.接口定义的方法都是抽象的,而抽象类可定义非抽象方法。
3.抽象类使用的是extends,而接口使用的是implements,在高级语言如java中一般是不允许使用多重继承的。所以只能继续一个抽象类,却可以实现多个接口。
4.abstract class和interface所反映出的设计理念不同。(abstract class表示的是"is-a"关系,interface表示的是"like-a"关系)
假设为了描述动物的吃的行为,我们可以定义抽象类也可以定义接口,如下:
public abstract class Animal{
abstract void eat(){...};
}
public interface Animal{
void eat();
}
如果这时候想加一个飞行的行为,实现可能如下:
public abstract class Animal{
abstract void eat(){...};
abstract void fly(){...};
}
public interface Animal{
void eat();
void fly();
}
这样设计的话会出现一些问题:
如果有一些动物的实体类中不支持飞行的方法,但却已经具有飞行的方法了。
违背了Interface Segregation
Principle(使用多个专门的接口比使用单一的总接口要好)。
这时候只能通过用抽象类+接口和接口+接口的方式类解决以上的问题:
public abstract class Animal{
public abstract void eat(){...};
}
public interface AnimalFly(){
void Fly();
}
这时实体类可以先继承Animal的抽象类再实现AnimalFly()的方法,也可以:
public interface Animal{
void eat(){...};
}
public interface AnimalFly(){
void Fly();
}
这样实体类只要直接实现两个接口便可
csdn某大神的例子(略有修改),即接口定义的都是abstract方法,所以动物抽象类则可定义非抽象方法:
namespace my
{
interface 行为
{
void 吃();
void 睡();
}
abstract class 动物 : 行为
{
public
abstract void 吃();
public virtual void 睡()
{
Console.WriteLine("我们的动物是会睡的,不是玩具!");
}
}
class 猴子 : 动物
{
public override void 吃()
{
Console.WriteLine("我是一只猴子所以要在树上吃!");
}
public void 跳()
{
Console.WriteLine("我是一只猴子所以要跳来跳去的!");
}
}
class myClass
{
public static void Main()
{
//动物 a = new 动物();
//您见过一个动物这种品种吗?
猴子 b = new 猴子();
b. 睡();
b. 吃();
b. 跳();
}
}
}
以上大部分总结自互联网,有错之处,还望指出