我有一个抽象类和一个类,它扩展了它并实现了方法,而没有添加自己的其他方法。 让我们调用类A和B. B扩展A.我应该像这样创建一个B类实例
A newInstance = new B();
或者像这样
B newInstance = new B();
它有什么不同,哪种更好?
答案 0 :(得分:0)
它有什么不同,哪种更好?
编程到接口而不是实现它是优先的方式,在这里阅读更多 - > What does it mean to "program to an interface"?。不同之处在于,如果必须使用相同的合同更改实现,则必须遵循合同而不是实现,以确保只需更改对象创建部分。
在你的例子中,如果你这样定义
A newInstance = new B();
您只能使用A
合约中可见的方法。
在这种情况下:
B newInstance = new B();
您可以使用B
合约中显示的方法,并且由于B与IS-A
的关系A
,您也可以使用A
方法。
答案 1 :(得分:-2)
为了可维护性,我会选择第二个:
B newInstance = new B();
显然,目前无关紧要,因为A
和B
在字段和方法方面完全相同(根据您的说法)。
但是,请说您的课程B
会发生变化。您添加方法或字段。如果您将新实例声明为A newInstance = new B()
,则无法访问您在B
中所做的更改。
就第二点而言,从外行人的角度来看,使用第二点更有意义。