1. ホーム
  2. inheritance

[解決済み] Swift言語における抽象クラス

2022-04-27 15:52:23

質問

Swift言語で抽象クラスを作成する方法はありますか、それともObjective-Cのように制限があるのでしょうか?Javaが抽象クラスとして定義しているものに匹敵する抽象クラスを作りたいと思っています。

どのように解決するのですか?

Swiftには抽象クラスがありません(Objective-Cと同じです)。最善の方法は プロトコル これはJavaのインターフェイスのようなものです。

Swift 2.0 では、プロトコル拡張を使用して、メソッドの実装と計算されたプロパティの実装を追加することができます。あなたの唯一の制限は メンバ変数や定数を提供できない そして 動的ディスパッチはありません .

この手法の例としては、次のようなものがあります。

protocol Employee {
    var annualSalary: Int {get}
}

extension Employee {
    var biweeklySalary: Int {
        return self.annualSalary / 26
    }

    func logSalary() {
        print("$\(self.annualSalary) per year or $\(self.biweeklySalary) biweekly")
    }
}

struct SoftwareEngineer: Employee {
    var annualSalary: Int

    func logSalary() {
        print("overridden")
    }
}

let sarah = SoftwareEngineer(annualSalary: 100000)
sarah.logSalary() // prints: overridden
(sarah as Employee).logSalary() // prints: $100000 per year or $3846 biweekly

これは構造体に対してもquot;abstract class"的な機能を提供していますが、クラスも同じプロトコルを実装できることに注意してください。

また、Employee プロトコルを実装するすべてのクラスまたは構造体は、annualSalary プロパティを再度宣言する必要があることに注意してください。

最も重要なのは、以下の点に注意してください。 動的ディスパッチはありません。 . いつ logSalary として保存されているインスタンスに対して呼び出されます。 SoftwareEngineer では、オーバーライドされたバージョンのメソッドが呼び出されます。このとき logSalary にキャストされた後のインスタンスに対して呼び出されます。 Employee の場合、元の実装を呼び出します (インスタンスが実際には Software Engineer .

詳しくは、この機能に関する素晴らしいWWDCのビデオをご覧ください。 Swiftのバリュータイプでより良いアプリを作る