我有一个名为MilitaryReport的类,它实现了Reportable接口:
public class MilitaryReporter implements Reportable {
public String reportable_type(){
return "MilitaryReport";
}
public String reportable_db_name() { return "military_reports"; }
public void setUniqueAttribute(int attr) { this.uniqueAttribute = attr; }
public int uniqueAttribute(){
return some_unique_attribute_to_military;
}
}
我还有另一个名为OilReport的类,它实现了Reportable接口:
public class OilReport implements Reportable {
public String reportable_type(){
return "OilReport";
}
public String reportable_db_name() { return "oil_reports"; }
public int anotherUniqueAttribute(){
return some_unique_attribute_to_oil;
}
}
这是Reportable接口:
public interface Reportable {
public String reportable_type();
public String reportable_db_name();
}
这是问题所在。可报告对象是属于Report实例的策略。报告可以具有任何类型的可报告类型,例如军事,石油,驾驶员等。这些类型均实现相同的界面,但具有独特的元素。
我可以这样将报告分配给报告:
public class Report {
private Reportable reportable;
public void setReportable(Reportable reportable){ this.reportable = reportable; }
public Reportable reportable(){
return reportable;
}
}
然后,在客户端代码中,我可以为此实例分配一个可报告对象:
MilitaryReporter reportable = new MilitaryReporter();
reportable.setUniqueAttribute(some_val);
report.setReportable(reportable);
但是当我以后访问可报告对象时,我无法访问任何唯一方法。我只能访问在接口中实现的方法。这将无法编译:
report.reportable.uniqueAttribute();
问题是我不想将可报告的数据类型设置为MilitaryReport。我希望数据类型为可报告的,因此我可以为其分配任何类型的可报告的。同时,我想访问可报告对象的独特方法。
我如何解决这个限制?另一种设计模式?
最佳答案
接口的整个想法是,您不必关心它是什么类型的可报告。在接口级别Reportable
而不是MilitaryReportable
声明它时,您只会看到在Reportable
上声明的方法。如果您不想将其声明为MilitaryReportable
,但是您知道这就是事实,则可以对其进行强制转换:((MilitaryReportable)report.reportable).someUniqueMethod()