我来自关系数据库领域,我发现自己必须创建自己的第一个面向对象的程序,尽管学习了,但我仍然无法掌握如何做最基本的事情。
我定义了一个Product
类(int id
,String productName
,double price
...),其方法和属性以及一个ProductFamily
类(String familyName
,String costCenter
...)及其自己的方法和属性。
应如何链接/嵌入两个类?我尝试使用带有“ extends”关键字的子类,但这似乎只是将方法从一个继承到另一个。它不允许我将新产品对象实例化到给定的产品系列中。
谢谢!
答案 0 :(得分:1)
您必须在您的Product类中添加一个字段,该字段是ProductFamily类的对象。通过在Product类中添加方法getProductFamily(),您可以返回特定产品的产品系列。
答案 1 :(得分:0)
可能是这样的,假设ProductFamily
和Product
类之间存在1到N的关系:
class ProductFamily{
private List<Product> products;
//add all other members and getters and setters
}
无论何时要将新的Product
添加到特定的ProductFamily
实例,都可以从吸气剂中获取Product
的列表并将其添加。 ProductFamily
类中可能还有另一种方法,可让您将新的Product
实例添加到列表中。
class ProductFamily{
private List<Product> products;
//add all other members and getters and setters
public void addProduct(Product newProduct){
this.products.add(newProduct);
}
}
答案 2 :(得分:0)
您只能在Java中扩展一个类。您可以在许多课程中做到这一点。如果要使用相同的函数名称扩展多个类,则可以使用接口。
答案 3 :(得分:0)
如果您来自关系数据库领域,那么您可能会牢牢掌握几个相互关联的概念,包括关系联接,数据规范化,逻辑数据独立性,自描述数据,ACID事务和并发控制。对于初学者来说,如果不稍微熟悉所有这些概念,就很难真正掌握它们的功能和简单性。信不信由你,对象建模专家发现将这些概念与他们已经知道的东西进行比较并不容易掌握每个概念。
当您第一次开始学习对象建模时,也会发生类似的情况。三个相互关联的概念是继承,封装和多态性。如果没有其他两个方面的把握,这些都不是很有意义。他们共同努力,打造了既强大又简单的系统。
抵制将对象模型视为关系模型的诱惑,只是没有一些功能。这是对象模型的过度简化。事实是,这些建模范例中的每一个都是大约40到50年前在建模技术上的巨大进步。它们中的每一个都使考虑现有的系统或拟议的尚未构建的系统变得容易得多。
但是它们彼此不一样,而且两者都不是彼此衍生的。
如果您要从关系思考开始,这是开始的地方。确定产品与ProductFamily之间的关系是HAS-A关系还是IS-A关系。使用单独的表和外键可以轻松地(相对地)对HAS-A关系进行建模。就对象而言,最好将它们建模为单独的类,并相互引用。 IS-A关系不同。例如,一家宠物店可能有猫,狗,鸟和蛇,但它们都是宠物。有一些属性或方法仅与鸟或猫有关,但还有一些属性或方法与所有这些都有关。
在关系建模中,与父类/子类最接近的类似物不在关系模型中,而在扩展实体关系模型中。在这里,有一个概念称为通用化/专业化。猫,狗,鸟或蛇是广义宠物的特殊化。这是IS-A关系。如果泛化/专业化对您来说很有意义,那么子类和继承将很好地为您服务。如果没有,那么您最好不要在这里尝试使用子类。
StackOverflow中确实有数百个问题,这些对象是那些习惯于对象建模并且想知道如何与SQL表实现IS-A关系的人。最新的示例就在您的问题旁边,称为Schedule Join Multiple Tables。对于那些人,有一个标签class-table-inheritance。他们很难获得的是关系模型如何在没有继承概念的情况下做任何事情。您的问题正好相反。与在关系模式中相比,如何以及何时使用继承使生活更简单。而何时不使用继承。
您需要确定Product和ProductFamily是否是继承有用的情况。同样,如果这是HAS-A关系,请忘记子类和继承。如果是IS-A关系,则继承是简单解决方案的关键。为了对超类进行有意义的操作,您要么必须限制自己对超类有意义的操作,要么必须学习如何构建多态操作。这是很多学习的东西,但是在这条路的尽头有很多价值。