`
cfeers
  • 浏览: 139860 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

抽象类 Abstract class

    博客分类:
  • java
 
阅读更多
抽象类表示抽象概念,抽象概念是指在人脑中存在、实际并无此物的一种抽象存在。比如,你去超市买了一台微波炉,在此行动中,微波炉对你来说,是具体存在的,而“电器”则是抽象的。有人说,“微波炉”也很抽象啊,比如它是由很多零部件组成的,它的称呼也是由人们经过定义出来的。是的,任何一个人类使用的词语都可以看做是抽象的。树、水、花、虫都是抽象的概念。但是,在某一具体的场景中,具体和抽象是可以区分的。去超市买微波炉,在这个行为中,微波炉是具体的,电器则是抽象的。

在软件开发领域,我们称某种场景是问题域。去超市买微波炉,就是一种问题域。问题域中存在着各种各样的实体。比如在一个采购系统中有订单、发货单、发票,它们都是确实存在的实物,我们称它们是具体的;而票据不是具体的,是仅仅存在于我们头脑中的,我们称它是抽象的。抽象的概念被设计成为抽象类Abstract class. Abstract之所以不能被实例化,是因为它在问题域中不是真正存在的。比如在采购系统的问题域中,存在的只是订单、发货单、发票。

是不是有必要把订单、发货单、发票抽象出一个票据概念,要看具体问题。抽象可以隔离变化,这样可使此变化不影响彼模块,不会造成牵一发而动全身的窘境。如果有一块业务需要统一处理票据,且要处理的票据种类很可能将来会增加或减少(变化),则有必要抽象出票据的概念,并把它与各种票据实体绑定,即,各票据实体都继承自它。而票据处理业务模块只需要和抽象接口通信。将来新的票据类型出现不会影响到票据处理模块。

离开问题域去抽象是坏习惯,它只会导致垃圾类的产生。在采购系统中,如果票据这种抽象概念根本就跟问题域无关,则武断生成的票据抽象类就是垃圾类。

离开问题域甚至无法进行抽象,比如你无法断定“一杯水”是抽象的还是具体的,但在具体的场景中,“请给我一杯水”则是清楚具体的。无法区分抽象和具体就无法去进行抽象。

软件开发中,如果能在问题域中确认未来不会有任何变化,则摒弃抽象这种多余之举。

软件需求中唯一不变的就是它一直在变。
分享到:
评论

相关推荐

    PHP抽象类与接口的区别实例详解

    在上述代码中,我们定义了一个抽象类`AbstractClass`和两个继承它的子类`ConcreteClassOne`和`ConcreteClassTwo`。每个子类都实现了抽象类中声明的抽象方法`getValue()`和`prefixValue($prefix)`。 接着,我们来看...

    Java_abstract_example.rar_abstract class_抽象

    在这个例子中,`AbstractClass`是一个抽象类,包含一个抽象方法`doSomething()`和一个具体方法`commonBehavior()`。`ConcreteClass`是`AbstractClass`的子类,实现了`doSomething()`方法,并在`main`方法中创建了`...

    abstract抽象类

    在Java编程语言中,`abstract`关键字用于定义抽象类(abstract class),这是一个非常重要的概念,它为多态性提供了基础。抽象类是不能被实例化的,它们的主要目的是作为其他类的基类,提供一个公共的接口或者部分...

    Java中的接口和抽象类有什么区别?(java面试题附答案).txt

    **抽象类(Abstract Class)**: - 抽象类是一个抽象的类,它可以包含抽象方法和非抽象方法。 - 抽象类可以有构造方法,也可以包含字段和常量。 - 抽象类用于表示一种类的抽象概念,它可以包含通用的方法和字段。 - ...

    class.forname的作用 详细解析抽象类和接口的区别

    使用 abstract class 的方式定义抽象类可以有自己的数据成员,也可以有非 abstract 的成员方法,而使用 interface 的方式定义抽象类只能有静态的不能被修改的数据成员(也就是必须是 static final 的),所有的成员...

    abstract抽象类--Eclipse

    2. 右键点击项目,选择"New" -> "Class",在弹出的对话框中输入类名,然后勾选"Abstract class"选项,这将使你创建的类成为抽象类。 3. 在类定义中,你可以声明抽象方法,只需在方法签名前加上"abstract"关键字,不...

    JAVA抽象类和抽象方法(abstract)实例分析

    抽象类是指使用abstract关键字修饰的类,抽象类中的方法可以是抽象的,也可以是具体的。抽象类的主要作用是将父类的某些方法不确定时,可以用abstract关键字来修饰该方法,使其成为抽象方法。抽象类也可以包含具体的...

    [转]深入理解abstract class和interface

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

    Java中抽象类和接口的区别

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

    Java实例化一个抽象类对象的方法教程

    假设有一个抽象类`AbstractBase`: ```java public abstract class AbstractBase { public AbstractBase() { // 构造方法 } public abstract void doSomething(); } ``` 然后创建一个子类`ConcreteSub`来实现...

    浅谈C# 抽象类与开闭原则

    (1)使用关键字abstract修饰的类,称为抽象类. (2)抽象类只是用到一个类所具有的行为,不能单独通过创建对象来使用.使用new是错误的.可以通过派生类来实现其函数成员的具体逻辑。 (3)抽象类中可以有抽象方法,...

    抽象类的小练习abstractExercise

    例如,在`AbstractExercise`这个项目中,可能包含一个名为`AbstractClass`的抽象类,代码如下: ```java public abstract class AbstractClass { public abstract void someAbstractMethod(); // 其他可能的抽象...

    abstract class和interface有什么区别?

    - **抽象类 (Abstract Class):** - 抽象类是一种不能被实例化的类,它可能包含抽象方法(没有方法体的方法)和具体方法(有方法体的方法)。 - 子类继承抽象类时,必须实现其中的所有抽象方法,除非该子类也是抽象...

    深入理解abstract class和interface

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

    C#抽象类与抽象方法

    在C#编程语言中,抽象类(abstract class)和抽象方法(abstract method)是面向对象设计中的关键概念,它们主要用于支持多态性。抽象类是一种特殊的类,它不能被实例化,只能作为其他类的基类。抽象方法则是没有...

    C#中abstract继承抽象类

    在C#编程语言中,`abstract`关键字是用来定义抽象类和抽象方法的,这是一种面向对象编程的概念。本文将深入探讨C#中`abstract`关键字的使用、抽象类的特性以及如何继承抽象类。 首先,我们需要了解什么是抽象类。...

    class_abstract.rar_abstract c#_abstract C#_abstract c# 用途_c# 抽象

    首先,我们要明白抽象类(Abstract Class)在C#中的定义。抽象类是一种特殊的类,它不能被实例化,只能作为其他类的基类使用。抽象类通常用于定义一个接口或一组基本操作,它的子类将提供具体的实现。这种设计模式...

    java abstract class interface之间的区别介绍

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

    Java抽象类和抽象方法

    抽象类通过使用`abstract`关键字进行声明。 #### 特性 - 抽象类可以包含抽象方法和非抽象方法(具体方法)。 - 可以包含构造器、字段和静态方法。 - 抽象类可以有构造函数,但只能在继承类中使用,用于初始化父类...

Global site tag (gtag.js) - Google Analytics