[解決済み] Swift言語における抽象クラス
質問
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のバリュータイプでより良いアプリを作る
関連
-
[解決済み] Swiftでストアドプロパティをオーバーライドする
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Pythonで子クラスから親クラスのメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] Objective-Cで抽象クラスを作成する
-
[解決済み】Pythonで抽象クラスを作ることは可能か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン