我希望将尽可能多的可重复代码移动到基类中,但我发现自己需要将派生类中的变量传递回基类。
myClass
必须使用无参数初始化方法,并且通过myInterface.setup()
进行“设置”。
如何强制myBase
的扩展程序设置变量,而不必每次都从someBaseMethod()
interface myInterface
{
void setup(String myStr);
void someBaseMethod();
}
abstract class myBase implements myInterface
{
String myStr = null;
protected abstract String getMyStr();
// called lots of times.
public void someBaseMethod()
{
if (myStr == null) myStr = getMyStr();
// ...
}
}
class myClass extends myBase
{
String s = null;
public void setup(String myStr)
{
s = myStr;
}
protected String getMyStr()
{
return s;
}
}
答案 0 :(得分:1)
如果protected String getMyStr()
在子类中实现并返回特定于实现的字符串,则不应将其作为字段String myStr
保留在基类中。
只需创建一个局部变量:
public void someBaseMethod() {
final String myStr = getMyStr();
.....
另外,如果你需要在其他任何事情之前运行setup方法,那么你可能想要一个布尔标志,表示已经设置了字段。
答案 1 :(得分:0)
您可以在班级boolean
中添加myBase
变量,表示该班级已正确初始化。
E.g。
class MyBase {
private initialized = false; // Only for documentation as a bolean is always initialied to false
// further variables and methods
}
然后你只需要检查那个变量:
if (initialized) {
// Do your stuff
} else {
// Do some error handling
}
请注意,Java lasses通常以大写字母开头。
答案 2 :(得分:0)
您的代码对于您要执行的操作似乎非常笨拙。你为什么不这样做:
interface myInterface
{
void setup(String myStr);
void someBaseMethod();
}
abstract class myBase implements myInterface
{
private String myStr = null;
protected String getMyStr()
{
return myStr;
}
protected void setMyStr(String value)
{
myStr = value;
}
// called lots of times.
public void someBaseMethod()
{
// do stuff with myStr
}
}
class myClass extends myBase
{
public void setup(String myStr)
{
setMyStr(myStr);
}
}
或者我理解你的要求错了吗?