我是 OOP 的新手,所以我有一个关于类何时扩展
另一个类的愚蠢问题。
这是我的例子:
public class Test {
public Monitor getMonitor(){
return new LCD();
}
class LCD extends Monitor { NO-ERROR
class LCD { ERROR at line `return new LCD`
//some other method or function not in Monitor Class. Example:
boolean isSamsung;
public LCD whatkindLCD(){
}
}
}
我对上面的代码有一个问题:因为 LCD
是从 Monitor
扩展的,并且 LCD
有一些 Monitor 没有的其他属性/方法。那么,LCD
是 Monitor
的子级,对吧?
这意味着你试图把一个“大盒子”放到一个“小盒子”上。那么,为什么当我返回新的 LCD
时,Eclipse 不会像我只使用 class LCD {
时那样注意到错误。
谢谢:)
最佳答案
在第二种(错误)情况下,您忘记声明 LCD
事实上确实延伸了Monitor
。您只是定义一个“正常”的独立类 - 因此 new LCD()
不是 Monitor
的实例.
如果您声明 LCD
,编译器应该会很高兴。像这样的类:
class LCD extends Monitor {
//some other method or function not in Monitor Class. Example:
boolean isSamsung;
public LCD whatkindLCD(){
}
}
<小时/>
编辑(回应评论): LCD
根本不是问题与 Monitor
相比,该类具有额外的属性/方法。将调用 getMonitor()
的代码,只关心它是否得到 Monitor
返回 - 也就是说,具有 Monitor
的所有方法、属性和行为。 .
如果你有turnOff
和displayBitmap(int[][] data)
您的 Monitor
上的方法类,然后是你的LCD
类也会有这些方法。 LCD
的任何实例可以表现为 Monitor
当需要时 - 这是 OO 语言中子类化的基本原则。所以每当有东西想要 Monitor
,你可以给它一个LCD
,或 CRT
的实例或SamsungLCD
相反,如果您有这些,并且编译器可以确信正确的方法/属性将存在并且可以被调用。
(从技术上讲,如果您喜欢正式定义,则这就是 Liskov substitution principle,但您不需要如此详细地理解它。)
关于java - 面向对象Java : can return an child class to parent class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9365310/