【问题标题】:Can a ArrayBuffer of Abstract Class hold members of derived class in Scala?抽象类的 ArrayBuffer 可以保存 Scala 中派生类的成员吗?
【发布时间】:2018-09-30 17:22:50
【问题描述】:

我正在定义一个抽象类的 ArrayBuffer,如下所示。

abstract class Transformation(tableName: List[String],operation: List[String], outputTable: String){}
var transformationArray: ArrayBuffer[Transformation] = ArrayBuffer()

这个 ArrayBuffer 可以包含派生类的元素吗?

class Map(tableName: List[String], newColumn: String, operation: List[String], outputTable: String) 
extends Transformation(tableName: List[String],operation: List[String], outputTable: String) {

}

transformationArray += new Map(tableName,newColumn,operation,outputTable)

我无法从 transformationArray 访问 Map 的值

【问题讨论】:

    标签: scala abstract-class derived-class arraybuffer


    【解决方案1】:

    类构造函数默认为私有。添加val 以更改它。

    abstract class Transformation(val tableName   :List[String]
                                 ,val operation   :List[String]
                                 ,val outputTable :String)
    

    现在您可以访问它们了。

    transformationArray.head.outputTable  //res0: String = tbl
    

    【讨论】:

    • 谢谢。我可以访问抽象类中定义的变量,但不能访问派生类变量(newColumn)。有没有办法在Scala中实现抽象类指针指向派生类?
    • 如果newColumnprivate,您将无法访问它,我已经指出了如何更改它。我不知道“抽象类指针指向派生类”是什么意思。 Scala 不像 C 语言那样有指针。
    • 我将 newColumn 更改为 var。但是,我仍然无法访问它。只能访问属于基类的派生类成员。
    • 实际上你是对的,将newColumn 更改为val(或var)不会有帮助,因为从编译器的角度来看,transformationArray 中的所有元素都是@987654329 类型@,没有newColumn 成员数据。它可能在transformationArray 之外有更多的成员数据,但在该信息内部是完全隔离的。如果您告诉编译器“这是Transformation 元素的集合”,那么编译器将允许您访问什么。您必须使用模式匹配之类的东西将元素提取为完整的 Map 类型。
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2017-06-19
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多