java - 访问子类的属性

标签 java inheritance compiler-errors iteration

我对 Java 还很陌生,并且很难理解为什么我总是在命令行中收到错误。我有一个父类(super class) Guest,带有变量 guestID、fName、lName 和 dateJoin。我还有一个带有附加变量 VIPstartDate 和 VIPexpiryDate 的子类 VIPGuest。

我有一个 ArrayList guest,它保存我记录中的所有 guest 对象。我想迭代 ArrayList 并将每个 guest 写入一个文本文件,每个 guest 以 guestID、fName、lName、dateJoin 的形式换行,并用逗号分隔(或 guestID、fName、lName、dateJoin、VIPstartDate、VIPexpiryDate 如果该客人是 VIP 客人)。

我的代码如下。当我使用类似的代码对没有子类的类的对象的 ArrayList 执行类似的操作时,它工作得很好,但是当我尝试让它解决某些 guest 有额外变量的事实时,错误是:

  HotelImpl.java:440: error: cannot find symbol
                    + "," + g.getVIPstartDate() + "," + g.getVIPexpiryDate());
                             ^
      symbol:   method getVIPstartDate()
      location: variable g of type Guest
    HotelImpl.java:440: error: cannot find symbol
                    + "," + g.getVIPstartDate() + "," + g.getVIPexpiryDate());
                                                         ^
      symbol:   method getVIPexpiryDate()
      location: variable g of type Guest
    2 errors

我可以看到 VIPGuest 对象的额外变量有问题,但我想我已经用 if/else 修复了这个问题:

  public boolean saveGuestsData(String guestsTxtFileName){
    BufferedWriter writer;
    try{
      writer = new BufferedWriter(new FileWriter(guestsTxtFileName));
    } catch (IOException e){
      System.out.print("Invalid file.");
      return false;
    }
      try{
            for (Guest g : guests){
              if (!(g instanceof VIPGuest)){
                writer.write(
                g.getGuestID() + "," + g.getFName() + "," + getLName() 
                + "," + g.getDateJoin());

              }
              else {
                writer.write(
                g.getGuestID() + "," + g.getFName() + "," + 
                getLName() + "," + g.getDateJoin() + "," + 
                g.getVIPstartDate() + "," + g.getVIPexpiryDate());
              }
              writer.newLine();

            }
          writer.close();
          return true;
          } catch (FileNotFoundException ex) {
            System.out.print("File not found.");
            return false;
          } catch (IOException e){
            System.out.print("Invalid file.");
            return false;
          }
  }

最佳答案

gGuest 类型的引用,因此您只能从中访问 Gusest 的成员。如果您想访问 VIPGuest 的成员,则必须显式向下转换它。例如:

VIPGuest vg = (VIPGuest) g;
writer.write(g.getGuestID() + "," + 
             g.getFName() + "," + 
             g.getLName() + "," +
             g.getDateJoin() + "," + 
             vg.getVIPstartDate() + "," + 
             vg.getVIPexpiryDate());

这应该可行,但这是一个糟糕的设计,它迫使您的 saveGuestsData 方法深入了解您的 Guest 实现。更稳健的设计是将此逻辑移至 Guest 类,并让此方法仅调用它们:

public class Guest {
    @Override
    public String toString() {
        return getGuestID() + "," + getFName() + "," +  getLName() + "," + g.getDateJoin();
    }

    // other methods...
}

public class VIPGuest extends Guest {
    @Override
    public String toString() {
        return super.toString() + ", " + getVIPstartDate() + "," + getVIPexpiryDate());

    // other methods...
}

然后调用这个方法:

for (Guest g : guests) {
    writer.write(g.toString());
}

关于java - 访问子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55106814/

相关文章:

c# - 将一个类转换为从同一基类继承的另一个类

java - 在java中找到二维数组的总和

java - 将 Cookie 从 Java 传递到浏览器

java - 来自客户端计算机本身的客户端请求能否由服务器上的 java 处理?

java - 多语言BBD方案

java - Android Studio - 两个相同(相同源代码)的应用程序 - 一个可以工作,第二个不能 - 应用程序启动后关闭

Java Swing : Does the phrase "favor composition over inheritance" apply?

python - 如何用Python中的新类继承来替换动态继承?

java - 标识符预期困惑

c++ - 无法弄清楚错误