面向对象设计 - 如何将一个 class 嵌套到另一个 class

Object Oriented design - how to nest one class into another class

我来自关系数据库的世界,我发现自己不得不创建我的第一个面向对象的程序,尽管学习了,但我还是无法掌握如何做最基本的事情。

我定义了一个 Product class (int id, String productName, double price...),及其方法和属性,以及ProductFamily class (String familyName, String costCenter...) 有自己的方法和属性。

link/embed 两者 class 应该如何?我试过将 subclasses 与 "extends" 关键字一起使用,但这似乎只是从一个方法继承到另一个方法。它不允许我将新产品对象实例化到给定的产品系列中。

谢谢!!

您必须向 Product class 添加一个字段,它是 ProductFamily class 的一个对象。通过在您的产品中添加方法 getProductFamily() class,您可以 return 特定产品的产品系列。

可能是这样的,假设ProductFamilyProduct之间存在1对N的关系classes:

class ProductFamily{

    private List<Product> products;

    //add all other members and getters and setters
}

每当您想向特定 ProductFamily 实例添加新的 Product 时,您可以从 getter 中获取 Product 的列表并添加到其中。 ProductFamily class 中可能还有另一种方法,可让您将新的 Product 实例添加到列表中。

 class ProductFamily{

    private List<Product> products;

    //add all other members and getters and setters

    public void addProduct(Product newProduct){
        this.products.add(newProduct);
    }
}

您只能在 Java 中扩展一个 class。您可以在许多 class 中做到这一点。如果您想使用相同的函数名称扩展多个 classes,我会使用接口。

如果您来自关系数据库领域,您可能会牢牢掌握几个相互关联的概念,包括关系连接、数据规范化、逻辑数据独立性、自描述数据、ACID 事务和并发控制。如果不熟悉所有这些概念,初学者很难真正掌握其中每一个概念的强大功能和简单性。信不信由你,对象建模专家发现仅仅通过将它们与他们已经知道的事物进行比较来掌握这些概念中的每一个并不容易。

当您第一次开始学习对象建模时,也会发生类似的事情。三个相互关联的概念是继承、封装和多态。 None 如果不了解其他两个,其中的 None 就很有意义。他们齐心协力打造了一个既强大又简单的系统。

抵制将对象模型视为类似于关系模型的诱惑,只是没有某些特性。这是对象模型的过度简化。事实上,这些建模范式中的每一个都是大约四十到五十年前建模艺术状态的巨大进步。它们中的每一个都使思考现有系统或提议的系统变得容易得多,但尚未构建。

但它们彼此不同,两者都不是从另一个派生出来的。

如果您打算从关系思维入手,请从这里开始。判断 Product 和 ProductFamily 之间的关系是 HAS-A 关系还是 IS-A 关系。使用单独的表和外键可以很容易地(关系地)建模 HAS-A 关系。就对象而言,最好将它们建模为单独的 类,并从一个到另一个进行引用。 IS-A 关系是不同的。例如,一家宠物店可能有猫、狗、鸟和蛇,但它们都是宠物。有些属性或方法只适用于鸟类或猫,但有些属性或方法适用于所有这些。

关系建模中与 Superclass/Subclass 最接近的模拟不在关系模型中,而是在扩展实体关系模型中。这里,有个概念叫Generalization/Specialization。猫、狗、鸟或蛇是泛化宠物的特化。这是一种 IS-A 关系。如果 Generalization/specialization 在手头的情况下对您有意义,那么 sub类 和继承将为您提供很好的服务。如果不是,那么你最好不要在这里尝试使用 sub类 。

在 Whosebug 中,习惯于对象建模并想知道如何与 SQL 表建立 IS-A 关系的人们提出了数百个问题。最新的例子就在你的问题旁边,叫做 . For those people, there is a tag 。他们难以理解的是,没有继承的概念,关系模型怎么能干任何事情。你的问题正好相反。如何以及何时使用继承来使生活比在关系模式中更简单。以及何时不使用继承。

您需要确定 Product 和 ProductFamily 是否是继承有用的情况。同样,如果是 HAS-A 关系,请忘记 sub类 和继承。如果是 IS-A 关系,继承是解决问题的关键。为了对超类进行有意义的操作,您要么必须将自己限制在对超类有意义的操作上,要么必须学习如何构建多态操作。这是很多学习,但在路的尽头有很多价值。