要求构造器:
对于类的构造器还有一件事要说明:前缀为required的构造器。这意味着子类不能遗漏它。而这接下来就意味着如果一个子类使用指定构造器(这样会阻碍继承),它必须重写这个构造器(required)。一个例子:
这段代码无法编译。我们需要继承或者重写标记有required的构造器。由于,我们要引入新的Boolean值,因此不能采取继承的方法。所以我们要重写它:
上例中,被重写的required构造器并没有被override标记,而是被required标记,这说明required将会继续在NoiseDog的子类中继续传递。
以上是怎样制造一个要求构造器,下面我将谈谈为什么要制造要求构造器。
Cocoa带来的意外:
当你在subclassing某种Cocoa类的时候,构造器继承规定可能会导致一些意料之外的事情。比如,在进行iOS开发的过程中,你肯定会声明一个UIViewController的子类,let's say,你为你的子类设置一个指定构造器。这个指定构造器在父类(UIViewController)中是init(nibName:bundle:),所以,遵照规定,你调用了此构造器:
看起来还不错,但是你然后就会发现在别处的代码出现了问题:使得ViewController 实例不再编译了。
在写下指定构造器之前这段代码是合法的;现在则非法。原因在于在子类中使用指定构造器,将阻碍构造器继承,你需要重写该构造器(init(nibName:bundle)),即使你已经你在子类中调用过它。
这样图4中的实例就可以顺利编译了。
然而现在又有一个意外:ViewController 无法编译了。原因在于:有一个要求(required)构造器在ViewController中。所以你必须使用它。而你之前不了解它,因为当ViewController没有显式构造器,你继承了要求构造器;现在你又阻碍了继承。幸运的是,Xcode的Fix-It功能提供了stub运用。他不会做任何事(甚至调用它,程序将会崩溃),但是它使得程序可以编译:
在之后的章节中我会讲解这个要求构造器如何被使用。