什么是抽象类?
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。
什么是接口?
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。接口方法不能包含任何实现。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。
对于抽象类和接口找了两个实例
抽象类:http://wenku.baidu.com/view/79c4833eeefdc8d376ee32e8.html
接口:http://www.cnblogs.com/zhangzt/archive/2009/11/28/1612556.html
这两个实例中分别应用的是接口和抽象类实现,当我需要添加其他类型的枪支或是其他的程序员,都可以很容易的添加,扩充性很好,这样使得我们的代码更容易维护!当然这两个实例都很简单,这样的话感觉两者没有什么区别。
下面说一下他们的区别:
1,接口支持多继承;抽象类不能实现多继承。举例当使用抽象类时,由于不能实现多继承,这时,需求改变需要添加新的功能,我们就可以用接口实现。
2,抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明
3,抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现
理解:
1,类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象
2,如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,用继承抽象类
3,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本布置子类的存在,方法如何实现还不确认,预先定义。
4,实现接口和继承抽象类并不冲突。
例如:
//1. 定义抽象类
public abstract class Animal
{
protected string _name;
//声明抽象属性
public abstract string Name
{
get;
}
//声明抽象方法
public abstract void Show();
//实现一般方法
public void MakeVoice()
{
Console.WriteLine("All animals can make voice!");
}
}
//2. 定义接口
public interface IAction
{
//定义公共方法标签
void Move();
}
//3. 实现抽象类和接口
public class Duck : Animal, IAction
{
public Duck(string name)
{
_name = name;
}
//重载抽象方法
public override void Show()
{
Console.WriteLine(_name + " is showing for you.");
}
//重载抽象属性
public override string Name
{
get { return _name;}
}
//实现接口方法
public void Move()
{
Console.WriteLine("Duck also can swim.");
}
}
public class Dog : Animal, IAction
{
public Dog(string name)
{
_name = name;
}
public override void Show()
{
Console.WriteLine(_name + " is showing for you.");
}
public override string Name
{
get { return _name; }
}
public void Move()
{
Console.WriteLine(_name + " also can run.");
}
}
//4. 客户端实现
public class TestAnmial
{
public static void Main(string [] args)
{
Animal duck = new Duck("Duck");
duck.MakeVoice();
duck.Show();
Animal dog = new Dog("Dog");
dog.MakeVoice();
dog.Show();
IAction dogAction = new Dog("A big dog");
dogAction.Move();
}
}
如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。
所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。
应用场合很简单了 (接口是设计的结果,抽象类是重构的结果)
1 优先定义接口
2如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。
通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才。