我有一个名为Property
的类,除了get
- 方法之外什么都没有。创建Property
的新实例时,将设置所有字段。 Property
实现了一个名为IProperty
的接口。
由于我使用的库中存在一些错误,我必须在创建后重新设置Property
实例的名称。因此,建议创建一个WrapperProperty
类,该类将提供一个公共setName
- 方法,该方法本身在setName()
中调用因此创建的Property
- 方法,该方法将受到保护/包视图。
问题在于我无法在Property
中保护此方法,因为Eclipse告诉我将其添加到接口IProperty
并将其公开。
有一些解决方法吗?
WrapperIProperty:
public class WrapperIProperty {
private IProperty prop;
WrapperIProperty(Property prop) {
this.prop = prop;
}
public void setName(String name) {
prop.setName(name);
}
}
属性:
public class Property implements IProperty {
String name;
protected void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getFoobar() {
return 123;
}
public int getWhatever() {
return 987;
}
}
的iProperty:
public interface IProperty {
public int getWhatever();
public int getFoobar();
public String getName();
}
这就是目前的情况。显然它不会起作用,因为我不能在Property
类中保护该方法。因此,我最好以某种方式摆脱界面入口。但是如何?
答案 0 :(得分:1)
您可能想要做的是单独留下IProperty
界面(不要将setName
方法添加到其中)并创建一个委托包装类,它提供您想要的方法(包装接口的实现。)
通过这种方式,您可以将包装的属性和常规属性提供给任何需要它们。
public class WrappedProperty implements IProperty {
private String name;
private Property prop;
WrappedProperty (Property prop) {
this.prop = prop;
}
protected void setName(String name) {
this.name = name;
}
public int getWhatever() {
return prop.getWhatever();
}
public int getFoobar() {
return prop.getFoobar();
}
public String getName() {
if (this.name == null) {
return prop.getName():
} else {
return this.name;
}
}
}
public class Property implements IProperty {
public String getName() {
return "blah";
}
public int getFoobar() {
return 123;
}
public int getWhatever() {
return 987;
}
}
public interface IProperty {
public int getWhatever();
public int getFoobar();
public String getName();
}
答案 1 :(得分:0)
Interface
中的方法在范围上是公共的,因此实现类不能通过减少其可访问性来覆盖方法。让他们public
答案 2 :(得分:0)
您不能在接口中使用公共 methodName ,也不能在实现此接口的类中使用私有或受保护的 methodName 。
因此,您可以在类中公开 methodName :
<强>更新强>
如果只想在Interface中使用它,则必须在AbstractClass中更改接口并将其放入方法中 public final returnCode methodName 如果该方法对所有继承的类都是通用的
答案 3 :(得分:0)
找到解决该问题的方法:
WrapperIProperty:
public class WrapperIProperty {
private Property prop;
public WrapperIProperty(IProperty prop) {
this.prop = (Property) prop;
}
public void setName(String name) {
prop.setName(name);
}
}
<强>属性:强>
public class Property implements IProperty {
private String name = null;
[...]
void setName(String name) {
this.name = name;
}
}
<强>的iProperty:强>
public interface IProperty {
[...]
}
这将完成工作