http://www.cnblogs.com/KeithDan/archive/2007/05/21/754164.html
好象这是一个老生常谈的问题,最近有个学生问我他们的区别,于是我就又想起这个话题。
有不少的文章在描述这两者,但好象都没有怎么从初学者的浅显角度来看。
其实这两者有很多相识之处,当然也有很多不同之处。要理解它们,应该先从面向对象思想开始。面向对象思想里面,最基本的就是封装,继承和多态。所谓封装,说的小,方法(函数)也就是对一种操作的封装,说的大,用类来描述一个具体的对象。
那么在面向对象程序中应该说对封装还有一层新的定义,即将类的描述抽象化,也就是说描述类的外貌而不去考虑它的实际。
那么我们回过头来看抽象类,它必须被继承使用,描述的其实是一种继承关系,即"is a"的关系。类继承它,也就是说类拥有它所有抽象方法等,那么也就是类遵循了它所定义的规范。但是呢,这种规范是通过继承而来,类的发展必须依赖它的父类。
abstract class 工作
{
abstract void 上班()
}
class 张三 : 工作{}
abstract class 工作
{
abstract void 上班()
}
class 人: 工作{}
class 李四 : 人{}
我们从这个例子中不难看出,张三和李四同样都遵循抽象工作的规范,都拥有上班这个方法,但是呢,他们的发展始终受到父类的影响。
当然,我这里只是从它们使用的角度来看,我们还能从他们设计角度度来看。上面我们虽然实现了人.上班()的过程,但是,这却违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),我们把李四的作为人的行为和他工作的行为混在一起。
那我们再来看看接口(interface),引用航天奇侠兄的一句话,接口,就是一个类的函数规范。 一个类 “继承”一个接口,等于说这个类必须提供接口所要求的所有函数。但是呢他们是一种实现关系,虽然在C#里我们还叫它为继承接口,但实际它是一种"like a"的关系。
interface 工作
{
public void 上班();
}
class 张三 : 工作{}
interface 工作
{
public void 上班();
}
class 人 {}
class 李四 : 人,工作{}
interface 工作
{
public void 上班();
}
class 动物 {}
class 人 : 动物 {}
class 王五 : 人,工作{}
此时我们来看,张三和李四同样遵循着interface工作所定义的规范,但是呢,他们(类)的发展并不受到父类的影响,张三、李四、王五都可以自由的发展自身类,具备有很高的自由度,我们再来从面向对象设计角度看,李四、王五继承人(因为他本质就是人),实现了工作。
应该说,接口的使用面比抽象类更广一些,而抽象类呢比接口更具限制性,体现的是继承关系。
当类的发展不需要受到限制和约束时,我们可以使用接口,此类可以自由的发展,此时继承接口的这个类它就是一个稳定的类,这也体现了接口保持类的稳定性。
这两者具备有很大的相似性,都源直面向对象思想,在使用何时抽象类,何时接口并没有一个定论,应该根据自己程序的大小,设计的方式,程序发展的空间来看,这就需要大家自己斟酌了。
分享到:
相关推荐
抽象类和接口是Java编程语言中两个非常重要的概念,它们都是用来描述对象的,但是它们之间有着很大的区别。 一、抽象类 抽象类是用来描述同一类事物的公共部分的高度提取。它可以定义自己的成员变量和成员方法,並...
这里有好多比较好的资料,很适合正在学习Java和对Java想进一步了解的朋友. 如: 一.C#类和接口、虚方法和抽象方法及值类型和引用类型的区别 二 .C#中 接口与抽象类 的区别 三....抽象类和接口的区别
综上所述,《Visual C# 2005开发技术》教程全面覆盖了C#编程的关键技术,从抽象类和接口设计到多态性实现,再到XML编程和ASP.NET控件的使用,旨在帮助开发者熟练掌握C# 2005的开发技能,提升软件开发效率。...
那么在类中对一个借口来定义,从本质上讲,跟在抽象类中定义一个接口一样,也体现着它的抽象性,即它是可以变化的。 定义接口的目的是让代码有更强的可扩展性。那么为何要定义接口?以及接口有何意义呢?关于接口...
例如,在 util 类中封装了会改变的 worker,可以理解为,util 类里面有自己的算法,一部分是固定的,而另外一部分是可变的,尚学堂陈老师指出这个可变的部分就变成了一个接口,接口则是特殊的抽象类,worker 可能在...
`ABCMeta`元类是抽象基类的元类,当子类化一个使用`ABCMeta`作为元类的类时,如果没有实现所有标记为`abstractmethod`的方法,那么子类也将被视为抽象类,无法直接实例化。 ```python from abc import abstract...
接口比抽象类更灵活,一个类可以实现多个接口,但在C#中只能继承一个抽象类。 设计模式是软件工程中的重要工具,但并非现代软件开发的核心。它们是经验的总结,帮助开发者在面对常见问题时有标准的解决方案。虽然...
- C++的虚类(抽象类)遵循单继承规则,一个子类只能继承一个虚类,而Java的接口则支持多重继承,一个类可以实现多个接口。 2. 构造方法: - 抽象类可以包含构造方法,允许子类在实例化时进行初始化操作,而接口...
3. 定义抽象实现接口(Refined Abstraction):这个接口或抽象类继承自抽象接口或抽象类,提供了更多的业务逻辑,同时保持对实现部分的引用。 4. 创建具体实现类(Concrete Refinements):这些类实现了抽象实现...
总结起来,C#中的抽象类是一种强大的工具,用于定义共享接口和行为,而开闭原则则是指导我们设计可扩展和可维护系统的准则。正确运用这两个概念,可以使我们的代码更符合面向对象设计的原则,从而提升软件质量。在...
接口(interface)是另一种重要的面向对象特性,它定义了一组抽象方法,用于规范类的行为。 总结来说,Java的类与对象是实现面向对象编程的基础,它们帮助我们构建可重用、可扩展的代码结构。理解并熟练掌握这些...
接口可以被看作是一组约束的抽象,规定了使用者和实现者之间的协议。接口的出现使得 Java 程序设计技术更加接近现实世界。接口的作用包括:提供了类之间的协议,规定了类之间的交互方式,提高了程序的可扩展性和维护...
**抽象工厂模式(Abstract Factory Pattern)是创建型设计模式之一,它提供了一种创建对象的接口,使得子类可以决定实例化哪一个类。这种类型的设计模式属于类的创建模式。** 在C#中,抽象工厂模式的核心在于抽象...
在C#中,桥接模式可以通过接口或抽象类来实现,它能够很好地处理系统中抽象类和实现类数量过多导致的复杂性问题。 首先,我们来看桥接模式的基本结构。桥接模式包括四个主要角色: 1. **抽象接口(Abstraction)**...
抽象类是一种不能实例化的类,它通常包含抽象方法,即没有具体实现的方法。抽象类是作为其他类的基础模板,子类可以通过继承抽象类来实现抽象方法,提供具体的实现。通过这种方式,我们可以定义通用的行为,并在子类...
抽象工厂(Abstract Factory)是一个接口或抽象类,定义了一组用于创建相关对象的接口。这些对象通常属于同一产品族,也就是它们具有某种共同的特性或者相互之间有紧密的联系。例如,我们可以有一个WindowsFactory来...
在C#编程中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。"Abstract Factory"模式是其中一种,它属于创建型...在C#中,通过接口和抽象类来实现这一模式,可以充分利用语言特性,实现良好的封装和解耦。
在C#中,这可能是一个接口或抽象类,如`IButton`或`IWindow`。 4. **具体产品(Concrete Product)**:实现了抽象产品接口,提供了具体的产品实例。在C#中,这将是实现了`IButton`或`IWindow`的类,如`WindowsButton...
浅谈Java面向接口编程 面向接口编程是Java编程中的一种重要思想,它与面向对象编程紧密相关。在本文中,我们将探讨面向接口编程的概念、接口的本质、面向接口编程的思想内涵、面向接口编程的好处等方面。 一、面向...