我想知道(请原谅这是一个重复的问题,但我找不到具体关于我的问题的信息)定义一个方法作为返回父类型或子类型的区别。这是我的具体方案:
想象一下以下的类和接口:
public interface Color{
public int getRedVal();
public int getGreenVal();
public int getBlueVal();
}
public class RGBColor implements Color{
public int getRedVal() {...}
public int getGreenVal() {...}
public int getBlueVal() {...}
}
public class HSVColor implements Color{
public int getRedVal() {...}
public int getGreenVal() {...}
public int getBlueVal() {...}
}
现在,如果我要包含一个名为getRGB()
的方法,那么它们之间会有什么区别:
public Color getRGB() {return new RGBColor();}
和
public RGBColor getRGB() {return new RGBColor();}
我似乎无法找到有关此问题的文档,我确信这是一个简单的答案。无论哪种方式,都要提前感谢答案。
答案 0 :(得分:2)
public Color getRGB() { return new RGBColor(); }
向上投射在这里(投射到超类型)。你正在研究更抽象的层面而不考虑实现(什么是好的),并且只能使用父方法。
public RGBColor getRGB() { return new RGBColor(); }
您和您的架构与实现(RGBColor
)紧密相关,但可以使用此子类中定义的特定方法。
我更喜欢第一个选项而不是第二个选项。
答案 1 :(得分:0)
首先,您应该使工厂方法保持静态。
其次,两种方法的区别在于声明的返回类型。如果你使用了两个定义中的第一个,那么程序员就会写:
Color c = getRGB(); // this is legal
他们写不出来:
RGBColor c = getRGB(); // This is illegal
答案 2 :(得分:0)
如果您已正确编码到界面,则没有太大区别。但是,差异只是参考类型。
假设RGBColor
有一个额外的公共方法:
public int[] getRGBFormatVals() //I dunno; I made it up!
您无法在从返回类型Color
获取的实例上调用此方法,但如果使用了返回类型RGBColor
,则可以。重申我之前的观点,如果您已正确编码到您的界面,则不太可能发生这种情况。
由于您的方法被称为getRGB
,我建议您返回RGBColor
,因为这应该是从具有此类名称的方法返回的。您可以轻松地将其分配给Color
引用,但具有相同的效果并查看结果。