j p*_*ton 2 java oop private interface access-modifiers
我在使用在界面中实现的私有方法时遇到问题。
我在接口print(string, list)中私有地实现了一个方法RequestData,以隐藏实现,因为我不希望除了类的其他打印方法之外调用它 - 但我将它包含在接口中,因为它与每个实现类都相同。
问题是,当我尝试使用printmy 中FundingRequests实现该RequestData接口的方法时,它显示错误 - 该print方法在接口中的访问RequestData是私有的,因此无法找到它。
好吧...如果接口的私有方法无法从实现类中访问,那么您应该如何使用它们呢?
这是一个错误,还是我误解了接口?
界面:
package com.landbay.datamodel.data;
import java.util.List;
public interface RequestData<E> {
void add(E newRequest);
List<E> getRequests();
List<E> getFulfilledRequests();
List<E> getUnfulfilledRequests();
void printRequests();
void printFulfilledRequests();
void printUnfulfilledRequests();
private void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
System.out.println(string);
}
}
Run Code Online (Sandbox Code Playgroud)
违规类和方法:
public class FundingRequests implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
}
Run Code Online (Sandbox Code Playgroud)
私有方法作为 Java 接口的一项功能提供,以帮助在接口中编写默认方法,而无需重复使用代码。它们不打算用于实现继承。
如果您想继承并使用已实现的方法,例如您在此处尝试的方法:
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
Run Code Online (Sandbox Code Playgroud)
您想要在超类中实现该方法并扩展该类,或者将该方法作为接口中的默认方法实现。使用超类将是更传统的方法来做到这一点。
使用您提供的代码,您可以执行以下操作:
class Printer {
protected void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
}
Run Code Online (Sandbox Code Playgroud)
然后扩展该类:
public class FundingRequests extends Printer implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
}
Run Code Online (Sandbox Code Playgroud)
尽管这会限制您的班级只能扩展该班级。更好的模式是将该方法实现为类中的公共静态方法,然后使用它,如下所示:
class Printer {
public static void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用方法:
public class FundingRequests implements RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
...
@Override
public void printRequests() {
Printer.print("",new ArrayList<>(requests));
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的想疯狂,你可以用一个抽象类来实现:
abstract class RequestData<E> {
abstract void add(E newRequest);
abstract List<E> getRequests();
abstract List<E> getFulfilledRequests();
abstract List<E> getUnfulfilledRequests();
abstract void printRequests();
abstract void printFulfilledRequests();
abstract void printUnfulfilledRequests();
protected void print(String listTitle, List<E> listToPrint) {
StringBuilder string = new StringBuilder();
string.append(listTitle);
for (E request : listToPrint) {
string.append("\n").append(request);
}
System.out.println(string);
}
}
Run Code Online (Sandbox Code Playgroud)
然后扩展该类:
public class FundingRequests extends RequestData<FundingRequest> {
private TreeSet<FundingRequest> requests;
FundingRequests() {
this.requests = new TreeSet<>();
}
// implement the abstract methods
@Override
public void printRequests() {
print("",new ArrayList<>(requests));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |