gpt4 book ai didi

java - 从父类对象调用子类方法

转载 作者:太空狗 更新时间:2023-10-29 22:37:00 26 4
gpt4 key购买 nike

我有以下类(class)

class Person {
private String name;
void getName(){...}}

class Student extends Person{
String class;
void getClass(){...}
}

class Teacher extends Person{
String experience;
void getExperience(){...}
}

这只是我实际架构的简化版本。最初我不知道需要创建的人的类型,所以处理创建这些对象的函数将一般的 Person 对象作为参数。

void calculate(Person p){...}

现在我想使用这个父类对象访问子类的方法。我还需要不时访问父类方法,所以我无法将其抽象化


我想我在上面的例子中简化了太多,所以这里是,这是实际的结构。

class Question {
// private attributes
:
private QuestionOption option;
// getters and setters for private attributes
:
public QuestionOption getOption(){...}
}

class QuestionOption{
....
}
class ChoiceQuestionOption extends QuestionOption{
private boolean allowMultiple;
public boolean getMultiple(){...}
}

class Survey{
void renderSurvey(Question q) {
/*
Depending on the type of question (choice, dropdwn or other, I have to render
the question on the UI. The class that calls this doesnt have compile time
knowledge of the type of question that is going to be rendered. Each question
type has its own rendering function. If this is for choice , I need to access
its functions using q.
*/
if(q.getOption().getMultiple())
{...}
}
}

if 语句显示“找不到 QuestionOption 的 getMultiple”。 OuestionOption 有更多的子类,它们具有不同类型的方法,这些方法在子类中不常见(getMultiple 在子类中不常见)

最佳答案

注意:虽然这是可能的,但完全不推荐这样做,因为它会破坏继承的原因。最好的方法是重构您的应用程序设计,以便没有父子依赖关系。 parent 永远不需要知道自己的 child 或他们的能力。

但是..你应该可以这样做:

void calculate(Person p) {
((Student)p).method();
}

一个安全的方法是:

void calculate(Person p) {
if(p instanceof Student) ((Student)p).method();
}

关于java - 从父类对象调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com