我有一个名为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()

07-28 02:14