Java类和子类

3
在我学习Java的下一步中,我现在正在学习类和继承。
我有一个作业需要解决,但是我有些卡住了,所以我来这里不是要求代码,而是想知道你是否同意我的思路,如果不同意,帮助我指导一下。请理解,不幸的是,我并不完全了解Java,我正在这门语言上迈出蹒跚的步伐。
因此,问题是:
"打算创建一个支持会议组织的程序。 会议具有名称、地点和日期。此外,每个会议都有一个组织委员会和一个程序委员会。两个委员会的成员均由姓名、电子邮件地址和机构标识。组织委员会成员还因其在会议中的角色(财务、空间或餐食)而特征化。程序委员会成员则通过反映他们在先前版本的会议中的表现(差、一般、好、优秀)的参数进行特征化。此外,程序委员会成员还与需要审核的文章列表相关联。
每篇文章均以标题、作者列表和评估结果(1到5之间的注释,其中5为最佳)进行特征化。作者通过姓名、电子邮件地址、机构和注册费用进行特征化。该费用可以是两种类型之一:高级(教师或研究人员)和学生。学生应考虑学位(学士、硕士或博士)。
高级作者的会议注册费为400美元,学生的费用为200美元。订阅使您可以提交一篇文章。想要提交多篇文章的高级作者必须为每篇额外的文章支付50美元。认为每篇文章的第一作者将负责在会议上演示该文章。"
根据这个问题,我需要实现一些函数,但这不是我来这里的原因。
阅读此问题,我可以看到:
name
email
institution

这是用来识别委员和作者的标识。

所以,我在考虑创建一个

public class Identification{
    ---------------
    name
    email
    institutionName
    ---------------
}

然后一切都变得复杂了,因为我知道我必须创建一些扩展那个类的东西。

我可以创建:

public class Conference{
    ---------------
    name
    location
    date[]
    ---------------
}

然后

public class Organization extends Conference{
    ---------------
    role[] // 0 for finance, 1 for spaces and 2 for meals
    ---------------
}

并且。
public class Program extends Conference{
    ---------------
    performance[] //0 poor, 1 fair, 2 good and 3 excellence
    articlesList[] // probably an id of and article
     ---------------
}

但是组织和程序两个类都有成员,并且这些成员由与Identification类相同的东西进行标识。据我所知,Java只能扩展一个类,因此我现在陷入了如何处理它们之间关系的困境。

阅读问题的其余部分后,我确定

public class Article{
    ---------------
    title
    listOfAuthors[] //probably an id
    evaluation //this is done by two members on program committee but I can't figure out how they relationship between themselves.
     ---------------
}

public class Authors{
    ---------------
    type[][] // 0 for seniors and 1 for students on first column and 0 teachers, 1 researchers, 2 bachelor, 3 master and 4 doctorate on second column.
    numberOfArticles //how many articles author wants to submit
    conferenceFee[] // if on type[i][0] is 0 then Fee is 400 + (numberOfArticles * 50)  else is 200
    ---------------
}

这是否是正确的方法,我不明白是否需要创建所有这些类,以及哪个类继承另一个类。有什么意见吗?

favolas

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!更新!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

感谢您所有的反馈。让我们看看我是否至少理解了您的一些建议。

public class Member{
    ---------------
    memberID
    name
    email
    institutionName
    ---------------
}

public class Authors extends Member{
    ---------------
    authorsID
    conferenceFee
    ---------------
}

public class Seniors extend Authors{
    ---------------
    degree[] // 0 for teachers 1 for researchers
    numberOfArticles = // Some int
    fee = 400

    public int payment(int numberOfArticles ){
        return numberOfArticles * fee;
    }
    ---------------
}

public class Students extend Authors{
    ---------------
    degree[] // 0 bachelor, 1 master and 2 doctorate
    numberOfArticles = // Some int
    fee = 200

    public int payment(){
        return fee;
    }
    ---------------
}

public class Article extend Authors{
    ---------------
    articleID
    title
    listOfAuthors[] //probably an id
    ---------------
}

public class ProgramCommitteeMember extends Member{
    ---------------
    role[] // 0 for finance, 1 for spaces and 2 for meals

    ---------------
}

public class OrganizationCommitteeMember extends Member{
    ---------------
   lasYearPerformance[] //0 poor, 1 fair, 2 good and 3 excellence
   articlesList[] // probably an id of and article
    ---------------
}

public class Committee{
    ---------------
    committeeType[] // 0 for Organization Committee and 1 for Program Committee
    ---------------
}

public class OrganizationCommittee extends Committee{
    ---------------
    listOfMembers[] //member id
    ---------------
}

public class ProgramCommittee extends Committee{
    ---------------
    listOfMembers[] //member id
    ---------------
}

这是正确的方式吗?
5个回答

2
我认为你混淆了继承和组合。
一个组织是一种会议吗?如果不是,就不要继承它。其中一个需要包含另一个 - 当第一个消失时,第二个必须消失。也可能是另一个需要引用回第一个 - 子项需要知道其父项。这也可以。
一个节目是一种会议吗?这里也是同样的情况。
看一下Liskov替换原则

谢谢。会议有两个委员会,一个是组织委员会(因此类名为Organization),另一个是程序委员会(因此类名为Program)。 - Favolas

0

我看到了几个地方,我认为你走错了路。

  1. 在Conference中,您将日期显示为数组。每个Conference实例只有一个日期。

  2. 您将Organization和Program都显示为Conference的子类。它们不应该是这样的。相反,应该有一个名为Committee的超类,其中包含两个子类:OrganizationCommittee和ProgramCommittee。然后,您的Conference类具有两个内部变量,每个变量都是OrganizationCommittee和ProgramCommittee类型。换句话说,“委员会”不是“会议”的一种类型,而是“会议”的成员。(在这里,我所说的成员并不是“参加会议的人”,而是“由另一个对象拥有的对象”)

  3. 每个委员会都有成员。因此,您需要一个Member超类,其中包含两个子类:OrganizationCommitteeMember和ProgramCommitteeMember。然后,您的ProgramCommittee将包含一个ProgramCommitteeMembers列表(例如数组),而您的OrganizationCommittee将包含一个OrganizationCommitteeMembers列表。

  4. 还有一件事,您在Organization中将role[]显示为数组。首先,角色适用于委员会成员,而不是组织。其次,每个成员只有一个角色。您需要一种方法来定义一系列预定角色,以便只能分配几个有效值中的一个。但是,每个成员只有一个角色。

关键在于你的指令中使用了“有一个”这个短语(意味着一个类包含另一个类的实例),还是使用了“是一个”这个短语(意味着一个类是父类的一种类型)。

希望这能帮助你找到正确的方向。


谢谢dnuttle。1-我的错,日期是一个数组,因为索引0将有年份,1个月和2天。2-谢谢,我明白了。3-一开始我想这样做,但在某个地方我放弃了成员超类。4-好的,那个角色应该是OrganizationCommitteMember中的一个变量。 - Favolas

0

仔细查看您需要表示的“实体”。实体可能会成为程序中的对象。您需要哪些实体/对象? - 比如,从“委员会”和“委员会成员”这些实体开始。

一旦找到所有涉及的实体,您可以开始查看并比较它们:

是否有不同的实体具有共同的事物(属性)? 这些是那些实体的共同超类的候选对象。您提议的Identification类正是正确的方法。 现在更进一步:哪些实体具有可识别属性?它们应该继承自Identification

还要记住,“class B 继承自class A”通常意味着“B是A的特殊种类”。您的组织是否是会议的特殊种类?


谢谢Hanno。我发现作者、组委会成员和程序委员会成员都有共同的身份识别,所以我认为身份识别应该是它们的父类,但是一个会议作为组委会和程序委员会,所以我也认为它们是会议的子类,所以肯定出了问题。 - Favolas

0

你说得对,Java不允许多重继承(也就是说,每个类只能继承一个其他类)。

一般来说,类、子类和继承的概念是这样的:特定子类的对象是其超类的特定种类。例如,有一个Animal类,然后创建一个扩展Animal的Horse子类是有意义的。

或者,使用你介绍的框架,你可以有一个Author类,然后有一个Senior类和一个Student类,两者都扩展Author。利用这种结构的一个好方法是在这三个类中包含一个返回int的pay()方法。由于学生作者只需要支付200美元,所以Student类中的pay()方法将返回200,而Senior类中的pay()方法将返回400。关键观察到的是现在你可以在任何Author对象上调用pay()方法,因此你不需要提前检查作者是高级还是学生。你应该能够想出类似的方法来处理问题的其他方面。


谢谢。最初我想制作那些类,但错误地认为它们太多了。 - Favolas

0

这里没有太多的继承,我认为我会一直使用聚合和接口。

成员(你称之为身份) 然后 委员会成员扩展成员 和 程序委员会成员扩展成员

将继承视为X是Y

组织是会议并不是很有意义。这是委员会成员在会议上履行的角色。所以 会议和会议 然后角色描述成员和会议。

程序委员会成员对会议有表现,因此您又有了 会议和会议 表现描述了成员和会议。

因此,您可以定义一个基类conferencemember,然后为角色和表现进行扩展。

这一切都与拥有和是有关 一本书有一个作者。 作者是作家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接