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. 跳(); } } }
以上大部分总结自互联网,有错之处,还望指出