java中的简单继承

时间:2010-08-28 15:01:22

标签: java inheritance

假设您需要实现一个业务功能,它会设置某种类型的配置文件。

但是,根据接收数据的方式,设置配置文件的实现方式会有所不同。

例如,参数可以直接传递给能够

的对象
setProfile();

或者,必须发现参数,并且必须通过

传递给个人资料
setProfile(String[] data, Blah blooh);

在这种情况下,最好的方法是什么?我的意思是,设计明智如何构建这个?

我正在考虑使用具有抽象方法的接口,这有效,但会引入一些噪音。不确定如何最好地构建它。

3 个答案:

答案 0 :(得分:5)

我总是对有很多重载的方法感到紧张。在这种情况下,我更喜欢将方法参数视为消息而不是参数,并构建一个如下的方法:

setProfile(ProfileData data)

ProfileData类可以包含所有setProfile方法中常见的数据,您可以为专门的setProfile操作创建派生类。

如果您使用的序列化技术可以根据其结构自动保留ProfileData对象,则此方法特别有用。

答案 1 :(得分:3)

我会将实际的配置文件抽象到它自己的类层次结构中,以封装它并将Generics添加到setProfile()。当然,它确实增加了一些复杂性,但因为它也引入了间接性,代码将更加分离,从长远来看应该证明是有用的。

此外,实际的功能可能完全在其自己的类层次结构中,以使该部分也可插入,这意味着您手中有Strategy Pattern。但是,决定采用这种方法需要更多地了解您正在构建的系统,并且可能不适合您正在构建的系统。

快速举例:

/**
 * Interface for describing the actual function. May (and most likely does)
 * contain other methods too.
 */
public interface BusinessFunction<P extends Profile> {
    public void setProfile(P p);
}

/**
 * Base profile interface, contains all common profile related methods.
 */
public interface Profile {}

/**
 * This interface is mostly a matter of taste, I added this just to show the 
 * extendability.
 */
public interface SimpleProfile extends Profile {}

/**
 * This would be what you're interested of.
 */
public interface ComplexProfile extends Profile {
    String[] getData();
    Blah blooh();
}

/**
 * Actual function.
 */
public class ComplexBusinessFunction implements BusinessFunction<ComplexProfile> {
    public void setProfile(ComplexProfile p) {
        // do whatever with p which has getData() and blooh()
    }
}

/**
 * And another example just to be thorough.
 */
public class SimpleBusinessFunction implements BusinessFunction<SimpleProfile> {
    public void setProfile(SimpleProfile p) {
        // do whatever with the empty profile
    }
}

答案 2 :(得分:0)

对于Get / Set方法,我总是将set方法保持为单个输入。这是一个简单的对象,可能是像kbirmington所建议的更复杂的对象。我认为我的做法不仅仅是任何真正的设计优势。

值得记住的是,如果配置文件数据有10个属性并且它们仅提供9个属性,那么根据这10个属性实际上缺少哪些属性,可能需要编写9种不同的方法。

至少对于单个结构,有一个输入,此外如果结构改变,方法不仅仅是其中的代码。

在这方面,你正在编程一个接口,这是一个很好的设计范例。