我想从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;
}
怎么做?
答案 0 :(得分:3)
如果没有显式命名子类,则无法读取您的类不拥有的字段。所以,这可行如下:
((c)this).f1;
然而,这样做会带来很难的代码味道:您现在将a
体现的抽象与其特定的实现/扩展之一联系起来。你最好重新考虑你的设计。
在Java中,您必须使用CamelCase和使用小写的包来命名您的类,否则可能会出现一些非常糟糕的名称解析异常。更不用说任何Java用户都会完全忘记阅读您的代码。
答案 1 :(得分:2)
你真的不想这样做,因为它违背了继承的想法。
但是,您可以设置由派生类实现的抽象函数。这是很好的编程风格。这些函数可以访问派生类和基类中的成员数据。
像(i)使用反射和(ii)转换为派生类这样的事情是黑客攻击,应该避免。原因是更改派生类不应该触发基类更改的必要性。
答案 2 :(得分: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; }
}