gpt4 book ai didi

scala - 使用抽象父类(super class)实例和 "access to protected method not permitted"错误的 protected 方法

转载 作者:行者123 更新时间:2023-12-04 22:54:18 24 4
gpt4 key购买 nike

我设计了一个相当简单的例子来说明我的观点如下:

abstract class AbstractSuperClass {
protected def someFunction(num: Int): Int
def addition(another: AbstractSuperClass, num: Int): Int
}

class SubclassSquare extends AbstractSuperClass {
override protected def someFunction(num: Int): Int = num * num
override def addition(another: AbstractSuperClass, num: Int): Int =
someFunction(num) + another.someFunction(num)
}

我在执行代码时收到以下错误消息。 (当然, main 函数是正确定义的。)

Error:(12, 33) method someFunction in class AbstractSuperClass cannot be accessed in AbstractSuperClass Access to protected method someFunction not permitted because prefix type AbstractSuperClass does not conform to class Subclass where the access takes place someFunction(num) + another.someFunction(num)



方法 addition 导致了问题。该代码尝试访问 AbstractSuperClass 实例的 protected 字段,但从我的角度来看,这里应该不会引起任何问题,因为 SubclassSquareAbstractSuperClass 的子类。

但是,我知道这里一定有我不明白的地方。我想知道如何更改我的代码以使其编译。好评。

最佳答案

在 scala 中,protected 比在 java 中限制更多。

我发现 this answer 在理解 scala 的 protected 修饰符时非常有帮助。

if protected member is not qualified(i.e. its just plain protected) then it is visible with another instances of declaring class into declaring class as well as with this into class and subclass.



因此,您可以按如下方式修改 SubclassSquare 中的加法函数:
override def addition(another: AbstractSuperClass, num: Int): Int =
someFunction(num) + another.asInstanceOf[SubclassSquare].someFunction(num)

这段代码可以编译,但如果参数不是 SubclassSquare 的实例,它就会崩溃,所以这不是一个好的解决方案。

更好的方法是使用 访问限定符 。所以你只需要用 protected 修饰符指定你的包名,例如 protected[yourPackageName]。这样做将使您的 protected 成员可以在声明的包或以下包中的类中访问。所以你的代码看起来像:
abstract class AbstractSuperClass {
protected[yourPackageName] def someFunction(num: Int): Int
def addition(another: AbstractSuperClass, num: Int): Int
}

class SubclassSquare extends AbstractSuperClass {
override protected[yourPackageName] def someFunction(num: Int): Int = num * num
override def addition(another: AbstractSuperClass, num: Int): Int =
someFunction(num) + another.someFunction(num)
}

关于scala - 使用抽象父类(super class)实例和 "access to protected method not permitted"错误的 protected 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59596386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com