swift 3.0 开发中有这样一个需求:我要在父类定义一个协议,协议中的方法是类方法,并且能够让子类重载。想到这里感觉很简单的样子,然后就去实践。发现一些细节还是要注意的。我们都知道static和class修饰方法的区别,static修饰的类方法不能被子类重载,而class修饰的是可以的。所以首先想到的是这样写
你会发现不能像以前一样在protocol中写class了,错误原因是class关键字只能在classes中使用,我们声明的protocol确实不在classes中,提示我们用static类代替;因为我们要子类能够重载的,用static怎么重载呢?确实是个问题。
既然swift 3.0对class关键字做了更加严格的要求,而这个问题又是那么的常见,一定会给我们留个方法去解决。也许你会说让每一个子类遵守这个协议不就行了,但是你想想如果有很多的子类,本来可以父类遵守,子类重载就可以的事情,写的那么麻烦,有没有很恶心的感觉;另外,我如果想要在父类中写一个默认的实现,子类重载的话调用子类的,不重载就调用父类默认的实现,这的场景又该如何解决?所以问题还需要解决的。
由于在protocol中只能用static来标识类方法,那我也就只能用static了,如图
按照父类实现默认协议,子类重载的需求我做了如下的尝试,在父类中用class关键字来实现protocol,子类就能重载了,这样能不能成功呢,实践得到是可以的。
子类中重载协议
MMHOrderModel也顺利的解析出了model。由此可见,重在实践!!!