コンピュータプログラミングにおいて、特性とは、クラスの機能を拡張するために使用できる一連のメソッドを表す言語概念です。[1] [2]
根拠
オブジェクト指向プログラミングでは、互いに関連のないクラス間で動作が共有されることがあります。たとえば、関連のない多くのクラスに、オブジェクトをJSONにシリアル化するメソッドがある場合があります。これまで、動作を必要とするすべてのクラスでコードを重複させることなく、この問題を解決する方法がいくつかありました。他の方法には多重継承やミックスインがありますが、これらには欠点があります。ミックスインが適用される順序が変更されたり、親クラスまたはミックスインに新しいメソッドが追加されたりすると、コードの動作が予期せず変更される可能性があります。
特性は、クラスが特性を使用して目的の動作を実現できるようにすることで、これらの問題を解決します。クラスが複数の特性を使用する場合、特性が使用される順序は重要ではありません。特性によって提供されるメソッドは、クラスのデータに直接アクセスできます。
特徴
トレイトは、プロトコル (インターフェース)とミックスインの側面を組み合わせます。インターフェースと同様に、トレイトは 1 つ以上のメソッド シグネチャを定義し、実装クラスはそれを実装する必要があります。ミックスインと同様に、トレイトは実装クラスに追加の動作を提供します。
異なる特性によって提供されるメソッド間で名前の衝突が発生した場合、プログラマーはクラスでどのメソッドを使用するかを明示的に明確にする必要があります。つまり、多重継承のダイヤモンド問題を手動で解決する必要があります。これは、競合する名前がスコープ規則によって自動的に解決されるオブジェクト指向プログラミングの他の合成方法とは異なります。
特性を使用して実行できる操作には次のものがあります: [3] [4]
- 対称和: 2つの独立した特性を結合して新しい特性を作成する操作
- オーバーライド(または非対称和):既存の特性にメソッドを追加して新しい特性を形成する操作。一部のメソッドをオーバーライドする可能性もあります。
- エイリアス: 既存のメソッドに新しい名前を追加して新しい特性を作成する操作
- 除外: 既存の特性からメソッドを削除して新しい特性を形成する操作。(これをエイリアス操作と組み合わせると、浅い名前変更操作が生成されます)。
メソッドがトレイトから除外されている場合、そのメソッドは、トレイトを使用するクラス、またはそのクラスの親クラスによって提供される必要があります。これは、トレイトによって提供されるメソッドが、除外されたメソッドを呼び出す可能性があるためです。
形質合成は可換(つまり、形質AとBが与えられた場合、A + B はB + Aと同等)かつ結合的(つまり、形質A、B、およびCが与えられた場合、 ( A + B ) + C はA + ( B + C )と同等)である。[1]
制限事項
特性は多くの選択肢に比べて大きな利点を提供しますが、特性自体にも制限があります。
必要なメソッド
トレイトが、使用クラスに特定のメソッドの提供を要求する場合、トレイトは、それらのメソッドがトレイトのニーズと意味的に同等であるかどうかを知ることができません。Perl などの一部の動的言語では、必要なメソッドは完全なメソッド シグネチャではなくメソッド名でのみ識別できるため、必要なメソッドが適切であることを保証することが難しくなります。
除外方法
メソッドがトレイトから除外されている場合、そのメソッドはトレイトのその他のメソッドによって呼び出される可能性があるため、トレイトの「必須」メソッドになります。
サポートされている言語
特性はもともとプログラミング言語Self [5]に由来し、以下のプログラミング言語でサポートされています。
- AmbientTalk : Self 特性 (オブジェクトベースの多重継承) とSmalltalkのSqueak特性 (プログラマによる明示的な特性の構成が必要) の特性を組み合わせたものです。これは、状態のある特性とフリーズ可能な特性に関する研究に基づいており、最初の定義では許可されていなかった特性内の状態を可能にします。[6]
- C# : バージョン8.0以降、C#はデフォルトのインターフェースメソッド[7]をサポートしています。これには特性のいくつかのプロパティがあります。[8]
- C++ :標準テンプレートライブラリとC++標準ライブラリで汎用コンテナクラスをサポートするために使用されます[9] [10]また、Boost TypeTraitsライブラリでも使用されます。[11]
- Curl : ミックスインとしての抽象クラスはメソッドの実装を許可し、別の名前で特性を構成します。[引用が必要]
- 要塞[12]
- Groovy : バージョン2.3以降[13]
- Haskell : Haskell では、Trait はType クラスとして知られています。
- Haxe : バージョン2.4.0以降。[14]マニュアルでは静的拡張[15]と呼ばれ、
usingキーワード - Java : バージョン8以降、Javaはデフォルトメソッド[ 16]をサポートしています。これは特性のいくつかの特性を持っています。[17] [18] [19] [20]
- JavaScript : 特性は関数と委譲[21]または特性を提供するライブラリを通じて実装できます。[22] [23] [24]
- Julia : いくつかのパッケージが特性を実装しています。例: [25]
- Kotlin :特性はM12以降インターフェース[26]と呼ばれています。 [27]
- ラッソ[28]
- Mojo : バージョン0.6.0以降[29]
- OCaml : 特性は、モジュールとモジュール型の包含、関数と関数型、クラスとクラス型の継承など、さまざまな言語機能を使用して実装できます。
- Perl :ロールと呼ばれ、 Moose 、Role::Tiny、Role::BasicなどのPerlライブラリに実装されています。ロールは姉妹言語Rakuの一部です。[30] Corinna OOP提案[31]の承認により、 Perlは現代のOOPシステムの一部として言語固有のロールを持つことになります。
- PHP : バージョン5.4以降、[32] [33] PHPでは、疑似多重継承として、複数の(特性)クラスから「継承」する機能を提供するテンプレートをユーザーが指定できるようになりました。
- Python :サードパーティのライブラリ経由[34] [35]または高階ミックスインクラス経由[36]
- Racket:特性をライブラリとしてサポートし、マクロ、構造体、ファーストクラスを使用して実装します。[37]
- Ruby :モジュールミックスインを使用して特性を実装することができます。[38]
- 錆[39]
- Scala [40] [41]特性はキーワードでサポートされています
trait。 - Smalltalk :特性はSmalltalkの2つの方言、Squeak [1]とPharo [42]で実装されています。
- Swift : トレイトはプロトコル拡張で実装できる。[43]
例
C#
C# 8.0 では、実装をインターフェースのメンバーとして定義できます。
システムの使用;
名前空間CSharp8NewFeatures ;
interface ILogger { // 従来のインターフェースメソッドvoid Log ( string message ); void LogError ( Exception exception );
//デフォルトのインターフェースメソッドvoid LogWarning ( string message ) { Console.WriteLine ( message ) ; } }
クラスLogger : ILogger { public void Log (文字列message ) { Console.WriteLine (メッセージ) ; }
パブリックvoid LogError (例外exception ) { Console.WriteLine ( exception.ToString ( ) ) ; } }
クラスProgram { static void Main ( string [] args ) { ILogger logger = new Logger ();
logger . LogWarning ( "何らかの警告メッセージ" );
} }
PHP の
この例では、特性を使用して他のクラスを強化します。
// テンプレート
特性 TSingleton
{
private static $_instance = null ;
private function __construct () {} // プライベートなデフォルトコンストラクタが必要であり、クラス内で開かないように注意する必要がある
パブリック 静的 関数 getInstance ()
{
if ( null === self :: $_instance ) {
self :: $_instance = new self ();
}
self :: $_instanceを返します。
クラス FrontController
{
TSingletonを使用します ; }
// すでに拡張されたクラスでも使用できます
class WebSite extends SomeClass
{
use TSingleton ;
}
これにより、多重継承の側面をシミュレートできます。
特性 TBounding
{
public $x 、 $y 、 $width 、 $height ;
}
特性 TMoveable
{
パブリック 関数 moveTo ( $x , $y )
{
// …
}
}
特性 TResizeable
{
public 関数 resize ( $newWidth , $newHeight )
{
// …
}
}
クラス Rectangle
{
TBounding 、TMoveable 、TResizeable を使用します 。
パブリック 関数 fillColor ( $color )
{
// …
}
}
さび
Rustのトレイトは、型が実装しなければならない一連のメソッドを宣言します。[44] Rustコンパイラでは、トレイトを明示的に指定する必要があり、これによりRustのジェネリックの安全性が保証されます。
// 型 T は "Ord" 特性を持たなければなりません
// そのため、">" および "<" 演算を実行できます
fn max < T : Ord > ( a : & [ T ]) -> Option <& T > { let mut result = a . first () ? ; for n in a { if * n > * result { result = & n ; } } Some ( result ) }
Debugやのような特性の面倒で繰り返しの多い実装を簡素化するために、Ordマクロを使用して、コンパイラに特定の実装を自動的deriveに生成するように要求することができます。[45]派生可能な特性にはClone、、、、、、、、、などがあります。
CopyDebugDefaultPartialEqEqPartialOrdOrdHash
参照
参考文献
- ^ abc Schärli, Nathanael; Ducasse, Stéphane; Nierstrasz, Oscar ; Black, Andrew P. (2003). 「特性: 動作の構成可能な単位」(PDF) .ヨーロッパオブジェクト指向プログラミング会議 (ECOOP) の議事録. コンピュータサイエンスの講義ノート。2743 . Springer: 248–274. CiteSeerX 10.1.1.1011.8 . doi :10.1007/978-3-540-45070-2_12. ISBN 978-3-540-45070-2。
- ^ Ducasse, Stéphane; Nierstrasz, Oscar; Schärli, Nathanael; Wuyts, Roel; Black, Andrew P. (2006 年 3 月). 「Traits: きめ細かな再利用のためのメカニズム」. ACM Transactions on Programming Languages and Systems . 28 (2): 331–388. CiteSeerX 10.1.1.64.2480 . doi :10.1145/1119479.1119483. S2CID 16434119.
- ^ Fisher, Kathleen ; Reppy, John (2003). 「Statically typed Traits」(PDF) .シカゴ大学. 2004年5月17日時点のオリジナルよりアーカイブ(PDF) 。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - ^ Fisher, Kathleen; Reppy, John (2004). 特性の型付き計算(PDF) . 第 11 回オブジェクト指向プログラミングの基礎に関するワークショップ。シカゴ大学。
- ^ Curry, Gael; Baer, Larry; Lipkie, Daniel; Lee, Bruce (1982). 「特性: 多重継承サブクラス化へのアプローチ」 SIGOA オフィス情報システム会議。米国ペンシルベニア州フィラデルフィア: ACM プレス。pp. 1–9。doi : 10.1145/966873.806468。
- ^ Van Cutsem, Tom; Bergel, Alexandre; Ducasse, Stéphane; De Meuter, Wolfgang (2009). 語彙ネストを使用した特性への状態および可視性制御の追加(PDF) . オブジェクト指向プログラミングに関するヨーロッパ会議 (ECOOP 2009). コンピュータサイエンスの講義ノート。Vol. 5653. Springer-Verlag. pp. 220–243. CiteSeerX 10.1.1.372.1265 . doi :10.1007/978-3-642-03013-0_11. ISBN 978-3-642-03012-3。
- ^ 「既定のインターフェイス メソッド」。C # 8.0 の新機能。Microsoft。2019年11 月 29 日閲覧。
- ^ 「C# 8.0 のインターフェイスが刷新されました」。C # 8.0 のインターフェイスの既定の実装。Talking Dotnet。2019 年 9 月 9 日。2019年11 月 29 日に閲覧。
- ^ "iterator_traits<Iterator>".標準テンプレートライブラリ. SGI.
- ^ Myers, Nathan C. (1995 年 6 月)。「Traits: 新しい便利なテンプレート手法」。C ++ レポート。2016 年1 月 23 日閲覧。
- ^ Abrahams, David. 「ジェネリックプログラミングテクニック: 特性」。Boost C++ ライブラリ。2016年1 月 23 日閲覧。
- ^ Steele, Guy; Maessen, Jan-Willem (2006 年 6 月 11 日). 「Fortress プログラミング言語チュートリアル」(PDF) . Sun Microsystems . 2016 年1 月 23 日閲覧。
- ^ 「オブジェクト指向: 特性」。Groovyプログラミング言語。2016年1 月 23 日閲覧。
- ^ 「Haxe 2.4.0 - Haxe - クロスプラットフォームツールキット」。Haxe - クロスプラットフォームツールキット。2017年9月12日閲覧。
- ^ 「マニュアル - Haxe - クロスプラットフォームツールキット」。Haxe - クロスプラットフォームツールキット。 2017年9月12日閲覧。
- ^ 「デフォルト メソッド」。Javaチュートリアル。Oracle。2016年1 月 23 日閲覧。
- ^ Liquori, Luigi; Spiwack, Arnaud (2008). 「FeatherTrait: Featherweight Java の控えめな拡張」. ACM Transactions on Programming Languages and Systems . 30 (2): 11:1. doi : 10.1145/1330017.1330022 . S2CID 17231803.
- ^ Liquori, Luigi; Spiwack, Arnaud (2008). 「インターフェースによる FeatherTrait Java の拡張」.理論計算機科学. 398 (1–3): 243–260. doi : 10.1016/j.tcs.2008.01.051 . S2CID 12923128.
- ^ Bono, Viviana; Mensa, Enrico; Naddeo, Marco (2014 年 9 月). Java 8 における特性指向プログラミング. Java プラットフォームでのプログラミングの原則と実践に関する国際会議: 仮想マシン、言語、ツール (PPPJ '14). pp. 181–6. CiteSeerX 10.1.1.902.161 . doi :10.1145/2647508.2647520.
- ^ Forslund, Emil (2016 年 2 月 3 日). 「Java における特性パターンの定義」. Age of Java . 2016 年 8 月 4 日時点のオリジナルよりアーカイブ。 2016 年2 月 3 日閲覧。
- ^ Seliger, Peter (2014 年 4 月 11 日)。「JavaScript の多彩な才能」。2015 年1 月 23 日閲覧。
- ^ 「Traits.js: JavaScript 用 Traits」。2016 年1 月 23 日閲覧。
- ^ Van Cutsem, Tom; Miller, Mark S. (2012). 「Robust Trait Composition for Javascript」(PDF) . Science of Computer Programming . 2016 年1 月 23 日閲覧。
- ^ 「CocktailJS」 。 2016年1月23日閲覧。
- ^ mauro3. 「SimpleTraits.jl」。GitHub 。 2017年3月23日閲覧。
{{cite web}}: CS1 maint: numeric names: authors list (link) - ^ 「インターフェース」。Kotlinリファレンス。JetBrains。2016年1 月 23 日閲覧。
- ^ Breslav, Andrey (2015 年 5 月 29 日). 「Kotlin M12 がリリースされました!」Kotlin ブログ. JetBrains . 2016 年1 月 23 日閲覧。
- ^ 「Traits」。Lasso言語ガイド。LassoSoft。2014 年 1 月 6 日。2016 年1 月 23 日閲覧。
- ^ 「Modular Docs - Mojo🔥 変更ログ」。docs.modular.com 。 2023年12月13日閲覧。
- ^ chromatic (2009 年 4 月 30 日). 「Perl ロールの理由」 . 2016 年1 月 23 日閲覧。
- ^ Curtis "Ovid" Poe. 「Corinna OOP 提案」. Corinna RFC . 2022 年9 月 30 日閲覧。
- ^ 「Traits」。PHP ドキュメント。PHP グループ。2016年1 月 23 日閲覧。
- ^ Marr, Stefan (2011 年 1 月 9 日)。「Request for Comments: Horizontal Reuse for PHP」。PHP.net wiki。PHPグループ。2011年1 月 31 日閲覧。
- ^ ペラ、テッポウ。 「py3traits ドキュメント」。2016 年1 月 23 日に取得。
- ^ ペラ、鉄砲 (2015-03-25)。 「py2traits」。GitHub。2016 年1 月 23 日に取得。
- ^ 「Higher Order Mixin Classes」。2016年10月9日時点のオリジナルよりアーカイブ。
- ^ 「Traits」。The Racket Reference 。 2016年1月23日閲覧。
- ^ David Naseby (2004年2月14日). 「Rubyの特性」. Ruby Naseby . 2016年1月23日閲覧。
- ^ 「Traits」。Rustプログラミング言語。2019年9月30日閲覧。
- ^ 「特性」。スカラ座のツアー。ローザンヌ連邦工科大学。2016 年1 月 23 日に取得。
- ^ Neward, Ted (2008 年 4 月 29 日)。「忙しい Java 開発者のための Scala ガイド: 特性と動作について」。IBM developerWorks。IBM。2016年1 月 23 日閲覧。
- ^ 「10分でわかる特性」Pharo: The CollaborActive Book 。 2016年1月23日閲覧。
- ^ ホレマンズ、マタイス (2015 年 7 月 22 日)。 「Swift 2.0 のミックスインとトレイト」。2016 年1 月 23 日に取得。
- ^ 「Traits - Rust を使用したプログラミング入門」。
- ^ 「Traits - Rustプログラミング言語」。
外部リンク
- 「特性: 動作の構成可能な単位」。ソフトウェア構成グループ。ベルン大学。
