2017-09-05 17 views
2

最終クラスとクラスの違いは何ですか?最終クラスとクラスの違いは何ですか?

final class A { 

} 

class B {  

} 
+0

は 'A'はあなたがから継承された意味https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html –

+1

@エクトルを拡張することはできません。拡張はSwiftの全く別のものです。 – Hamish

+0

はい、そうです。ごめんなさい –

答えて

7

決勝継承されたり上書きされるのを防ぐことができ、クラス修飾子です。

アップルのドキュメントから、あなたは 最終としてそれをマークすることによって を上書きされるのメソッド、プロパティ、または下付きを防ぐことができます。これを行うには、メソッド、プロパティ、または添字のintroducerキーワードの前にfinal修飾子 を記述します(最後のvar、final func、finalクラスfunc、および最後の添え字として など)。

サブクラス の最終メソッド、プロパティ、または添字をオーバーライドしようとすると、コンパイル時エラーが報告されます。エクステンションのクラスに追加するメソッド、プロパティ、または サブスクリプトは、エクステンションの定義内で最終的に とマークすることもできます。

class定義(finalクラス)のclassキーワードの前にfinal修飾子 を記述することで、クラス全体をfinalとしてマークすることができます。 最終クラスをサブクラス化しようとすると、コンパイル時エラーとして報告されます。

3

最終的には、誰もこのクラスから継承することはできません。

11

宣言が に上書きされる必要がないことがわかっている場合は、finalを使用してください。最後のキーワードは、クラス、メソッド、またはの宣言がをオーバーライドできないことを示す プロパティの制限です。 これにより、コンパイラは動的ディスパッチ間接を安全に削除できます。

続きを読む:

https://developer.apple.com/swift/blog/?id=27

0

finalほかに宣言も上書きする必要はありませんfinalは、実行時のオーバーヘッドを保存し、実行時に動的ディスパッチを無効にしているため、無使用finalよりも優れた性能を持っています。

3

finalのクラスはオーバーライドできません。


なぜ1は全くクラスは缶または無効にすることができないかどうかを気にする必要がありますか?

考慮すべき二つのものがあります:APIの設計者/開発者として

  1. が、あなたはサブクラス化時に虐待されたり悪用される可能性があなたFrameworkのクラスを持っているかもしれません。 finalは、クラスをサブクラス化するのを防ぎます。 finalを使用して、最終的ではないクラスのメソッド、プロパティ、および添え字をマークすることもできます。これは同じ影響を与えますが、クラスの特定の部分のためです。
  2. マーキングクラスfinalSwiftコンパイラメソッドテーブル(動的ディスパッチ)から関数を検索するのではなく、そのメソッドを直接呼び出す必要があります(静的ディスパッチ)。これにより、関数呼び出しのオーバーヘッドが減り、余分なパフォーマンスが得られます。 Swift Developer Blogのread more on thisにアクセスできます。
関連する問題