Kotlin 为什么公共类可以';你不能延长私人课吗?

Kotlin 为什么公共类可以';你不能延长私人课吗?,kotlin,Kotlin,我有以下类层次结构: interface Repository // This class contains some common stuff for LocalRepository and RemoteRepository. I'm never going to use this class outside this file, so I make it private private abstract class BasicRepositoryImpl // these classe

我有以下类层次结构:

interface Repository

// This class contains some common stuff for LocalRepository and RemoteRepository. I'm never going to use this class outside this file, so I make it private
private abstract  class BasicRepositoryImpl

// these classes are designed to be instantiated in other files    
class LocalRepository : BasicRepositoryImpl(), Repository // error

class RemoteRepository : BasicRepositoryImpl(), Repository // error
但我得到了以下错误:

子类有效可见性“public”应相同或更小 比其超类有效可见性“private”更宽松

我不想在其他任何地方使用
BasicRepositoryImpl
,因此它被声明为
private
,我想在其他类似以下文件中使用
LocalRepository
RemoteRepository

class Presenter(val repo: Repository)

val p = Presenter(LocalRepository())

但这个错误阻止了我创建这样一个层次结构。为什么?有什么问题吗?

只让它成为抽象类

定义:
抽象类是一个声明为抽象的类,它可能包含也可能不包含抽象方法。抽象类不能被实例化,但它们可以被子类化。

类及其祖先必须可以从使用类访问所有的。否则,在加载祖先类时,这将是一种冲突,而不仅仅是调用其方法或使用其功能。Kotlin在所有存在可访问性的情况下都非常清楚这一点

稍微打开它会允许一些可能导致以后真正的JVM访问冲突的事情,比如公共类中的
内联
函数,内联到另一个类中,调用私有的不可访问的祖先。如果您觉得这样做一个混合的可访问性模型是可以的,那么有很多漏洞您没有考虑。考虑因素的矩阵比仅隐藏某些类以避免实例化的愿望更大

由于类是抽象的,所以它只能作为祖先直接使用,所以您已经有了一些保护。如果要在模块外部阻止使用作为祖先,请将其构造函数设置为私有的或内部的,这样可以解决该问题:

abstract class BasicRepositoryImpl private constructor() { ... }
现在您已经保护了直接实例化(
abstract
)或用作基类(通过使用
abstract
和私有构造函数),所以最后要做的就是给它起个好名字,比如
AbstractBaseRepository
,按照惯例,人们将不再管它

如果您想讨论“为什么”,这是设计决策、技术限制或保护规则。。。然后尝试中的功能或语言更改建议。但要注意,事情并不像最初看起来那么简单。这些规则的存在是有原因的(即使其他语言危险地允许)