プロトコル拡張からインスタンスメソッドをオーバーライドしようとしていますが、問題が発生しています。
コンテキストとして、私はさまざまなUICollectionViewを備えたiOSアプリを作成しています。これらのビューは、さまざまなデータベースからデータを取得し(さまざまなコールバック機能が必要)、レイアウトも大きく異なります。(データベース、レイアウト)の任意の組み合わせが可能であるため、大量のコード重複なしに優れたOOPクラス階層を作成することは困難です。
レイアウト関数(主にUICollectionViewDelegateFlowLayoutプロトコルで定義されているもの)をプロトコル拡張に配置することを考えていたので、特定のUICollectionViewサブクラスを、関連するすべてのレイアウト関数を実装するように拡張されたプロトコルで装飾できますが、苦労していますそれの。問題の本質は、以下のコードに含まれています。
class Base {
func speak(){
print("Base")
}
}
class SubA: Base, ProtocolA {}
class SubB: Base, MyProtocolB {}
protocol MyProtocolA{
func speak()
}
protocol MyProtocolB{
func speak()
}
extension MyProtocolA{
func speak(){
print("A")
}
}
extension MyProtocolA{
func speak(){
print("B")
}
}
let suba = SubA()
suba.speak() // prints "Base", I want it to print "A"
let subb = SubB()
subb.speak() // prints "Base", I want it to print "B"
考え?
プロトコルのデフォルトの実装は、これらのプロトコルに準拠するクラスがそのメソッド自体を実装していない場合にのみ呼び出されます。クラスのメソッドは、プロトコルのデフォルトの実装をオーバーライドしますが、その逆ではありません。
通常、次のようなことを行います。
protocol MyProtocolA {
func speak()
}
protocol MyProtocolB {
func speak()
}
extension MyProtocolA {
func speak() {
print("A")
}
}
extension MyProtocolB {
func speak() {
print("B")
}
}
class SubA: MyProtocolA {}
class SubB: MyProtocolB {}
let suba = SubA()
suba.speak() // prints "A"
let subb = SubB()
subb.speak() // prints "B"
しかし、あなたがそうするなら
class SubC: MyProtocolA {
func speak (){
print("C")
}
}
let subc = SubC()
subc.speak() // prints "C"
率直に言って、これを見るとBase
、この例ではの使用は完全に冗長であるため、削除しました。明らかに、Base
他の理由でからサブクラス化する必要がある場合は、お気軽に。ただし、重要な点は、プロトコルのデフォルトの実装がクラスの実装をオーバーライドするのではなく、その逆であるということです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加