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

Java 面向对象设计-如何将一个类嵌套到另一个类中,java,database-design,architecture,entity,class-table-inheritance,Java,Database Design,Architecture,Entity,Class Table Inheritance,我来自关系数据库的世界,我发现自己必须创建我的第一个面向对象程序,尽管我在学习,但我无法掌握如何做最基本的事情 我已经定义了一个产品类int id、String productName、double price…,以及它的方法和属性,以及一个ProductFamily类String familyName、String costCenter。。。具有自己的方法和属性 如何链接/嵌入这两个类?我尝试使用带有extends关键字的子类,但这似乎只是将方法从一个继承到另一个。它不允许我将一个新的产品对象

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

我已经定义了一个产品类int id、String productName、double price…,以及它的方法和属性,以及一个ProductFamily类String familyName、String costCenter。。。具有自己的方法和属性

如何链接/嵌入这两个类?我尝试使用带有extends关键字的子类,但这似乎只是将方法从一个继承到另一个。它不允许我将一个新的产品对象实例化到一个给定的产品族中


谢谢

您必须向Product类添加一个字段,该字段是ProductFamily类的对象。通过在产品类中添加方法getProductFamily,您可以返回特定产品的产品族。

假设ProductFamily和产品类之间存在1:N的关系,则可能是这样的:


在Java中只能扩展一个类。你可以在很多课堂上做到这一点。如果你想用相同的函数名扩展多个类,我会使用接口。

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

当您第一次开始学习对象建模时,也会发生类似的情况。三个相互关联的概念是继承、封装和多态性。如果不掌握另外两个,这些都没有多大意义。它们一起工作,形成了一个强大而简单的系统

抵制诱惑,认为对象模型就像关系模型,只是没有一些特征。这是对对象模型的过度简化。事实上,这些建模范例中的每一种都是大约四五十年前建模艺术水平的巨大进步。它们中的每一个都使我们更容易考虑现有的系统或提议的系统,而这些系统尚未建成

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

如果你想从关系思维开始,这里是开始的地方。确定产品和ProductFamily之间的关系是HAS-a关系还是is-a关系。HAS-A关系很容易使用单独的表和外键进行关系建模。就对象而言,最好将它们建模为单独的类,并从一个类引用到另一个类。IS-A关系是不同的。例如,宠物店可能有猫、狗、鸟和蛇,但它们都是宠物。有一些属性或方法只适用于鸟类或猫,但也有其他属性或方法适用于所有这些属性或方法

关系建模中与超类/子类最相似的不是关系模型,而是扩展实体关系模型。这里有一个称为泛化/专门化的概念。猫、狗、鸟或蛇是宠物的特长。这是一种关系。如果泛化/专门化对您手头的案例有意义,那么子类和继承将很好地为您服务。如果不是,那么最好不要在这里尝试使用子类

StackOverflow中有成百上千个问题,这些问题是习惯于对象建模的人提出的,他们想知道如何实现与SQL表的IS-A关系。最新的示例就在您的问题旁边,名为。对于那些人来说,有一个标签。他们很难理解的是,如果没有继承的概念,关系模型是如何做任何事情的。你的问题恰恰相反。如何以及何时使用继承使生活比关系模式更简单。以及何时不使用继承


您需要确定Product和ProductFamily是否是继承有用的情况。同样,如果是HAS-a关系,那么忘记子类和继承。如果它是一种IS-A关系,那么继承是一种简单解决方案的关键。为了在超类上执行有意义的操作,您必须将自己限制为对超类有意义的操作,或者必须学习如何构建多态操作。这是很多的学习,但在这条路的尽头有很多的价值

谢谢,这很有意义,但是我如何创建构造函数来添加一个字段,而这个字段又是一个类呢
? 公共产品int id、字符串产品名称、双倍价格。。。{}public Product int id,String productName,double price,ProductFamily{}如果您创建一个新产品:Product p=new Product1,无论如何,1.0,someresource,其中someresource是现有ProductFamily的对象。谢谢,这绝对是一个1对多的关系。我真的不知道如何以这种方式向ProductFamily添加新产品,我添加了您建议的行,但是。。。我想这已经被回答了一百万次了,但是找不到答案,也找不到阅读的地方。谢谢@HernánRuiz我编辑了答案以向您展示方法再次感谢!很抱歉,我是一个新手/白痴,但我如何用这种方式实例化产品族中的新产品?您必须使用其构造函数实例化产品对象,然后使用addProduct方法将该实例传递给产品族实例
class ProductFamily{

    private List<Product> products;

    //add all other members and getters and setters
}
 class ProductFamily{

    private List<Product> products;

    //add all other members and getters and setters

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