java - 多态性,我的程序的问题

标签 java inheritance polymorphism

我一直在环顾四周,尽管我出于某种原因找到了一些答案,但我似乎无法理解这个概念,这显然导致了我的代码中的问题。

我有这个:

public static Contact createContact() {

    Contact contact = null;

    if (ContactUI.getRdb_acquaintance().isSelected()) {
        contact = new Acquaintance();
    } else if (ContactUI.getRdb_friend().isSelected()) {
        contact = new Friend();
        //contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText());
    } else {
        contact = new Family();
        //contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText());
        //contact.setStr_BDay(ContactUI.getTxt_BDay().getText());
    }

    setCommonDetails(contact);

    return contact;
}

我想要的是,一旦我将联系人初始化为其子类之一,就能够调用子类特定方法 .setStr_telMobile.setStr_BDay,但我得到错误,我无法访问这些方法。我已对代码中的行进行了注释。

例如,我认为我应该能够将 Contact 类型的对象初始化为 Friend(Contact 的子类),并访问该子类的专用方法和属性。

最佳答案

无论其运行时类型如何,contact 都是 Contact 类型的引用。因此,编译器将只允许您使用 Contact 的方法。

解决此问题的优雅方法可能是使用临时 Friend 引用来初始化您需要的所有成员,然后将其分配给 Contact:

// Snipped
} else if (ContactUI.getRdb_friend().isSelected()) {
    Friend temp  = new Friend();
    temp.setStr_telMobile(ContactUI.getTxt_telMobile().getText());
    contact = temp;
}
// snipped

或者,由于您知道已为 contact 分配了 Friend 实例,因此您可以将其显式向下转换为 Friend 以访问其方法:

// Snipped
} else if (ContactUI.getRdb_friend().isSelected()) {
    contact  = new Friend();
    ((Friend) contact).setStr_telMobile(ContactUI.getTxt_telMobile().getText());
}
// snipped

关于java - 多态性,我的程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32209682/

相关文章:

java - 如何从外键表中检索值?

java - NetBeans中的警报或对话框

c# - Microsoft.Reporting.WebForms.ReportViewer contol 在 ToolBar 中添加自定义控件

java - 什么是 Java 中的参数多态性(附示例)?

java - 使用 super 作为引用类型时无法访问子类中的方法

java - WebDriverWait.until(ExpectedConditions.elementToBeClickable(someAjaxMagic)) 永远不会返回

java - 如何调用 parking 票(parker, parker)?

javascript - 尝试覆盖和扩展 Typescript 子类中的方法签名

angular - angular2中的继承

C++ - 通过初始化列表构造 unique_ptr 的 vector