`
haojie
  • 浏览: 10780 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

interface 与 abstract Class

    博客分类:
  • j2se
阅读更多
从设计理念层面看abstract class和interface 
上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。 
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。 
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示: 
使用abstract class方式定义Door: 
abstract class Door { 
 abstract void open(); 
 abstract void close(); 
  
使用interface方式定义Door: 

interface Door { 
 void open(); 
 void close(); 
  
其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。 
如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。 
解决方案一: 
简单的在Door的定义中增加一个alarm方法,如下: 
abstract class Door { 
 abstract void open(); 
 abstract void close(); 
 abstract void alarm(); 
  
或者 
interface Door { 
 void open(); 
 void close(); 
 void alarm(); 
  
那么具有报警功能的AlarmDoor的定义方式如下: 
class AlarmDoor extends Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
  
或者 
class AlarmDoor implements Door { 
 void open() { … } 
 void close() { … } 
 void alarm() { … } 
} 
这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。 
解决方案二: 
既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。 
显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。 
如果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。 
如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示: 
abstract class Door { 
 abstract void open(); 
 abstract void close(); 

interface Alarm { 
 void alarm(); 

class AlarmDoor extends Door implements Alarm { 
 void open() { … } 
 void close() { … } 
    void alarm() { … } 
  
这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。
分享到:
评论

相关推荐

    interface&abstract class

    ### Interface与Abstract Class的区别及应用场景 #### 一、Interface与Abstract Class的概念理解 在面向对象编程语言中,如Java,接口(Interface)和抽象类(Abstract Class)是两种非常重要的概念,它们都被用来...

    abstract class和interface有什么区别?

    ### abstract class和interface有什么区别? 在面向对象编程中,`abstract class` 和 `interface` 都是用来实现抽象化的工具,但它们之间存在着重要的差异。理解这些差异有助于开发者更有效地设计和实现软件系统。 ...

    深入理解abstract class和interface

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...

    java中abstractclass和Interface.doc

    ### Java中的Abstract Class与Interface详解 #### 一、面向对象设计的重要性及抽象的概念 面向对象设计的核心在于抽象,这是衡量软件设计质量的关键因素之一。良好的软件设计不仅体现在高效的底层实现上,更重要的...

    Java面试题及答案

    ### Java中的Interface与Abstract Class的区别 #### 概述 在Java编程中,`interface`与`abstract class`是实现抽象类定义的两种主要方式。它们各自具有独特的优势和适用场景,选择哪种方式来定义抽象类往往取决于...

    java abstract class interface之间的区别介绍

    在Java编程语言中,抽象类(abstract class)和接口(interface)都是用于实现抽象化的重要工具,它们可以帮助程序员更好地组织代码,提高代码的可复用性和扩展性。尽管二者在功能上有一些相似之处,但在实际使用中...

    [转]深入理解abstract class和interface

    在编程领域,`abstract class`(抽象类)和`interface`是两种重要的设计模式,它们在构建可扩展和模块化的软件系统中起着至关重要的作用。这篇文章将深入探讨这两个概念,以及它们在实际开发中的应用。 首先,让...

    Struct 、Class、Interface、Abstract区别与关系

    Struct 、Class、Interface、Abstract各个的特性、应用场景等对比

    Java abstract class 与 interface对比

    在Java编程语言中,`abstract class`(抽象类)和`interface`是两种重要的机制,它们用于实现多态性和抽象性。虽然它们都可以用来定义抽象方法,但它们之间存在显著的差异,这些差异影响了开发者在设计软件时的选择...

    软件公司常用的面试题

    9) Interface与Abstract Class 接口只定义方法签名,不允许包含实现,类可以实现多个接口。抽象类可以包含部分实现,但一个类只能继承一个父类。接口强调多态性,抽象类则提供了部分实现和继承的灵活性。 10) 反射...

    JAVA软件工程师笔试题

    1. **Interface与Abstract Class的区别**: - 接口(Interface)是完全抽象的,不能包含实例变量,所有的方法默认都是public abstract的。它允许多继承,用于定义行为规范。 - 抽象类(Abstract Class)可以包含...

    Abstract Class Polymorphism_C#_

    在C#编程语言中,抽象类(Abstract Class)和多态性(Polymorphism)是面向对象编程的核心概念。这两个概念对于任何C#初学者来说都至关重要,因为它们能够帮助开发者构建灵活、可扩展和易于维护的代码。 首先,我们...

    abstract class

    abstract class 抽象类--不具体的类 1) 抽象方法,只有行为的概念,没有具体的行为实现。 2) 包含抽象方法的类,就一定是抽象类。 使用: abstract 关键字修饰,包含抽象方法。 如:平面图形一定可以计算面积。 ...

    JAVA基础-----面试宝典

    Interface 与 Abstract Class 的区别 - **Interface**:只能定义抽象方法,不能有实现。所有方法默认是 public abstract。 - **Abstract Class**:可以定义抽象方法也可以有具体实现,可以有构造器,可以是 final ...

    C# 最新面试 题库

    9) **Interface与Abstract Class**: 接口仅包含方法签名,没有实现。一个类可以实现多个接口。抽象类可以包含抽象方法和非抽象方法,一个类只能继承一个抽象类。 10) **反射**: 反射是.NET框架中的一种机制,...

    Java程序开发中abstract 和 interface的区别详解

    总的来说,正确理解和使用`abstract class`与`interface`有助于提高代码的可读性和设计的灵活性,使得程序更符合面向对象的原则,从而实现更好的复用和维护。在编写Java代码时,应根据实际需求和设计原则来决定使用...

    DONET开发面试题

    #### 十、Interface与Abstract Class的区别 1. **Interface**: 定义了方法签名但无具体实现,多个类可以实现同一个接口,用于定义一组共同的行为规范。 2. **Abstract Class**: 可以包含抽象方法和具体实现的方法...

    mock-confif

    9. **Interface与Abstract Class Mocking**:Mocking框架通常更适用于接口或抽象类,因为它们可以提供更多的灵活性和控制权。 10. **Mocking静态方法**:某些Mocking框架如PowerMock允许模拟静态方法,这对于测试...

Global site tag (gtag.js) - Google Analytics