![](/img/trans.png)
[英]Can i use reference of implementing class into method declared in Interface in java
[英]How can I add a protected method to a class implementing an interface in java?
我有一个叫做Property
的类,除了get
方法外别无其他。 创建Property
的新实例时将设置所有字段。 Property
实现了一个称为IProperty
的接口。
由于我使用的库中存在一些错误,因此在创建Property
实例后,必须重新设置其名称。 因此,建议创建一个WrapperProperty
类,该类将提供一个公共setName
方法,该方法本身将在Property
调用因此创建的setName()
方法,该方法将受到保护/封装。
问题是我无法在Property
中使此方法受保护,因为Eclipse告诉我将其添加到接口IProperty
并将其公开。
有一些解决方法吗?
包装IP属性:
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;
}
}
IPProperty:
public interface IProperty {
public int getWhatever();
public int getFoobar();
public String getName();
}
目前情况就是这样。 显然,这是行不通的,因为我无法让该方法在Property
类中受到保护。 因此,我最好以某种方式摆脱接口条目。 但是如何?
您可能想要做的就是不让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();
}
Interface
中的方法在范围上是公共的,因此实现类不能通过减少其可访问性来覆盖方法。 public
您不能在接口中具有公共methodName ,而在实现此接口的Class中不能具有私有或受保护的methodName 。
因此,您可以在您的Class中使用methodName公共:
更新
如果只希望在Interface中使用它,则必须在AbstractClass中更改Interface,然后将方法public final returnCode methodName放入其中,如果该方法对于所有继承的类都是通用的
找到了解决该问题的方法:
包装IP属性:
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;
}
}
IPProperty:
public interface IProperty {
[...]
}
这样就可以了
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.