【问题标题】:Instantiate an abstract class using another object's method? [duplicate]使用另一个对象的方法实例化一个抽象类? [复制]
【发布时间】:2014-06-02 20:02:07
【问题描述】:

我一直在研究创建一个条形码扫描程序,在我的研究中我遇到了一些我以前从未见过的东西,我不确定它到底在做什么......

这是我的程序的一个 sn-p,包括我不明白的行:

import javax.comm.*;    

public class InvScan implements SerialPortEventListener {


static CommPortIdentifier portId1;
SerialPort serialPort1;


public InvScan(){
    serialPort1 = (SerialPort) portId1.open("InvScan", 2000); //what does this mean? 
}

请参阅我评论“这是什么意思?”的那一行。 SerialPort 是一个抽象类...我知道可以使用匿名类来实例化抽象类,但我以前从未见过这种情况。这行代码来自一个程序教程,该程序旨在做与我想做的事情相关的事情,但作者没有很好地解释这里发生了什么(或者也许我只是不明白?)。他的笔记说:

我们通过执行 portId1 的 open() 方法来实例化 SerialPort 对象。回想一下,portId1 是一个 ComPortIdentifier 对象,而 open() 方法来自 ComPortIdentifier。

我进行了一些研究,但我什至找不到另一个例子来说明这里发生的事情(可能是因为我什至不知道该怎么称呼它,真的)。

这对我的程序来说甚至都不是必需的,因为我可以重新设计它(而不是成为脚本小子,哈哈),但我不知道那一行发生了什么,这真的让我很烦恼。

【问题讨论】:

  • 变量容器类型可以是抽象的,实例化的类型(从 open 方法调用中检索)仍然是从抽象基类型派生的具体类型。
  • 你不明白什么?它只是一个返回 SerialPort 类型对象的方法。它的实际具体类型是 Serial Port 的子类,可以是也可以不是匿名类。

标签: java abstract-class instantiation


【解决方案1】:

实际对象是派生自SerialPort 的非抽象子类的实例化。所有这一切都是为了保证抽象方法已在该实例化对象中完全定义。在内部,这看起来像:

public class CommPortIdentifier ... {

...

    public CommPort open(java.lang.String appname, int timeout)
            throws PortInUseException {

        CommPort val = new NonAbstractCommPort( ... );

        // Do something here

        return val;
    }

...

}

作为CommPort 的抽象子类,转换为SerialPort 有点冒险,除非保证对象的实际返回类型是SerialPort 的子类。

【讨论】:

    【解决方案2】:

    portId1.open 返回的任何内容都是SerialPort 的子类型。抽象类可能仍然有具体的子类型;这段代码所做的是将返回的对象转换为已知的超类型。

    【讨论】:

      【解决方案3】:

      portId1.open("InvScan", 2000) 行调用了一个方法,该方法返回SerialPort 的某个子类。然后它被转换为SerialPort。 (抽象类可以有非抽象子类。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        相关资源
        最近更新 更多