1

我想从 Java 中的基类访问类的字段。我可以在点网中做到这一点。看例子:

public class a{

// here I want to read the value of name or f1 or f2 or every other field values from derived classes
}
public class b extends a{
  public string name;
}
public class c extends a{
  public string f1;
  public string f2;
}

怎么做?

4

3 回答 3

3

如果不明确命名子类,您将无法读取您的类不拥有的字段。因此,这是可行的,如下所示:

((c)this).f1;

但是,这样做会产生不好的代码气味:您现在正在将体现的抽象绑定a到其特定实现/扩展之一。你应该更好地重新考虑你的设计。

关于代码约定的重要说明

在 Java 中,必须使用 CamelCase 命名类并使用小写字母命名包,否则可能会发生一些非常糟糕的名称解析异常。更不用说任何 Java 用户在阅读您的代码时完全迷失了。

于 2013-10-02T12:32:24.570 回答
2

你真的不想这样做,因为它违背了继承的想法。

但是,您可以设置由派生类实现的抽象函数。这是很好的编程风格。这些函数可以访问派生类和基类中的成员数据。

像 (i) 使用反射和 (ii) 转换为派生类这样的事情是 hack,应该避免。原因是更改派生类不应触发更改基类的必要性。

于 2013-10-02T12:34:41.143 回答
0

在这种情况下你应该做的是在你的类 a 中定义抽象方法,类 b 和 c 必须实现。然后,您可以从 a 调用这些方法以获取 b 和 c 设置的值。

public abstract class a{

// here I want to read the value of name or f1 or f2 or every other field values from derived classes
    abstract String getName();
    abstract String getF1();
    abstract String getF2();
}

public class b extends a{
  private String name;

  @Override
  public String getName() { return name; } 

  @Override
  public String getF1() { return null; }

  @Override
  public String getF2() { return null; }
}

public class c extends a{
  public String f1;
  public String f2;


  @Override
  public String getName() { return null; } 

  @Override
  public String getF1() { return f1; }

  @Override
  public String getF2() { return f2; }
}
于 2013-10-02T12:39:36.117 回答