为什么基类的子类不继承其公共便利性初始化程序?

时间:2020-09-29 16:15:32

标签: swift

我目前有一个写库的设置,其中包含三个目标:

  • A:包含一些公共类而不是公共类。
  • ATests:包含A中所有类的规范。通常导入A和ATestSupport。
  • ATestSupport:包含A中类的模拟和固定装置,因此,如果我需要A中某些类的模拟,BTests可以导入ATestSupport来获取它。

在A中,我上了课:

public class TestBaseClass {
    public convenience init() {
        self.init(a: SomeDI())
    }
    init(a: SomeDI) {}
}

(通常,我使用内部初始化程序进行依赖项注入,并实现便捷的初始化函数以提供默认注入)

在ATestSupport中,我有此类的模拟:

@testable import A

public class MockTestClass: TestBaseClass {}

(这些类通常由Cuckoo生成,它们不实现自己的初始化程序,而是从其父级继承它们。)

在ATests中,我有一些需要这个模拟类的规范:

@testable import A
@testable import ATestSupport

let someMockDI = MockTestClass() // this does not work, only the internal init is visible
let sut = SomeOtherClass(neededDI: someMockDI)

问题:

我目前不了解的原因是为什么我不能使用A中的便捷初始化程序来初始化此类,但是我可以使用内部初始化程序,而且如果我更改A中的实现,则可以使用它没有任何公共修饰符(对于类和初始化程序都没有),那么我可以使用(现在是内部的)便捷初始化程序。 同样有效的是将以前的内部初始化公开为公共,但是现在SomeDI也公开了,我试图避免。

我有什么办法可以保持自己的可见性,但可以在我的spec类中使用便捷初始化程序来启动模拟?

0 个答案:

没有答案