Trait (Programmierung)
Ein Trait (Deutsch: Eigenschaft, Charakteristik) ist ein Begriff aus der objektorientierten Programmierung und beschreibt eine wiederverwendbare Sammlung von Methoden und Attributen, ähnlich einer Klasse. Die Idee der Traits entspringt der Programmiersprache Self und findet mittlerweile in vielen modernen objektorientierten Sprachen Verwendung.
Die Verwendung von Traits erlaubt das horizontale Wiederverwenden einer Methodensammlung. Bei dem Prinzip der Mehrfachvererbung, das einige objektorientierte Programmiersprachen anbieten, ist das gleiche Vorgehen möglich; jedoch umgehen Traits (so wie auch Mixins) das Diamond-Problem, eine speziell durch die Mehrfachvererbung hervorgerufene Beziehungsproblematik unter verschiedenen Klassen.
Traits als besondere Variante der Mixins
Traits sind bei der Einbindung in andere Klassen viel flexibler als Mixins:<ref>kingcrunch.de: PHP5.4: Traits aka „Horizontal Reuse“</ref>
- einzelne Methoden eines Traits lassen sich ausschließen oder durch eine andere ersetzen
- mehrere Traits können in eine Klasse inkludiert werden, wobei sich Namenskonflikte (d. h. gleichbenannte Methoden) mit Hilfe von Aliasen lösen lassen.
- ein Trait kann Methoden benutzen, die nicht in ihm selbst definiert wurden, sondern in der inkludierenden Klasse.
- ein Trait bietet die Möglichkeit, auch Klassenattribute zu definieren.
Beispiele
PHP
In der Programmiersprache PHP können Traits ab der Version 5.4 benutzt werden:<ref>Einführung in Traits auf php.net</ref> <syntaxhighlight highlight="19" lang="php"> trait Hello {
public function sayHello()
{
echo 'Hello ';
}
}
trait World {
public function sayWorld()
{
echo 'World';
}
}
class HelloWorld {
use Hello, World;
public function sayExclamationMark()
{
echo '!';
}
}
$objHelloWorld = new HelloWorld;
$objHelloWorld->sayHello();
$objHelloWorld->sayWorld();
$objHelloWorld->sayExclamationMark(); </syntaxhighlight>
Das obige Beispiel gibt „Hello World!“ aus.
Programmiersprachen, die Traits unterstützen
- Curl
- Fortress<ref>Traits in Fortress (englisch, PDF-Datei; 2,5 MB)</ref>
- Groovy (ab Release 2.3)
- Haxe (mit der Zusatzbibliothek Composure möglich)<ref>Introducing Composure for Haxe (with Dependency Injection)</ref>
- JavaScript Delegation – Funktionsobjekte als Rollen (Traits und Mixins)
- Kotlin
- Perl 5 (roles, durch das Modul Moose)<ref>Moose::Role Dokumentation</ref>
- Pharo Smalltalk
- PHP ab Version 5.4
- Python (z. B. durch das Modul Traits<ref>PyPI: traits 4.4.0</ref>)
- Raku (auch dort roles genannt)<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20110921112151
| {{#ifeq: 20110921112151 | *
| {{#if: Perl 6: roles und traits | {{#invoke:WLink|getEscapedTitle|Perl 6: roles und traits}} | {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html}} }} (Archivversionen)
| {{#iferror: {{#time: j. F Y|20110921112151}}
| {{#if: || }}Der Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
| {{#if: Perl 6: roles und traits | {{#invoke:WLink|getEscapedTitle|Perl 6: roles und traits}} | {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2019-05-19 04:21:15 InternetArchiveBot | 2019-05-19 04:21:15 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20110921112151}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
}}
| {{#if:
| {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
| {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
| 16= {{#if: Perl 6: roles und traits | {{#invoke:WLink|getEscapedTitle|Perl 6: roles und traits}} | {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2019-05-19 04:21:15 InternetArchiveBot | 2019-05-19 04:21:15 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| 9 = {{#if: Perl 6: roles und traits | {{#invoke:WLink|getEscapedTitle|Perl 6: roles und traits}} | {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2019-05-19 04:21:15 InternetArchiveBot | 2019-05-19 04:21:15 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!{{#if: || }}
}}
| c|{{{webciteID}}}}} {{#if: Perl 6: roles und traits | {{#invoke:WLink|getEscapedTitle|Perl 6: roles und traits}} | {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html}} }} ({{#if: {{#if: 2019-05-19 04:21:15 InternetArchiveBot | 2019-05-19 04:21:15 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
| {{#if:
| Vorlage:Webarchiv/Today
| {{#if:
| Vorlage:Webarchiv/Generisch
| {{#if: Perl 6: roles und traits | {{#invoke:WLink|getEscapedTitle|Perl 6: roles und traits}} | {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html}} }}
}}}}}}}}{{#if:2019-05-19 04:21:15 InternetArchiveBot
| Vorlage:Webarchiv/archiv-bot
}}{{#invoke:TemplatePar|check
|all = url=
|opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
|cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
|errNS = 0
|template = Vorlage:Webarchiv
|format = *
|preview = 1
}}{{#ifexpr: {{#if:20110921112151|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
}}{{#if:
| {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
| web.archive.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}}
| webcitation.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}}
| archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
}}{{#if:
| {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
| }}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
}}
| {{#if:
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
}}
}}{{#if:{{#invoke:URLutil|isHostPathResource|http://chris.prather.org/traits-vs-roles.md.html}}
|| {{#if: || }}
}}{{#if: Perl 6: roles und traits
| {{#if: {{#invoke:WLink|isBracketedLink|Perl 6: roles und traits}}
| {{#if: || }}
}}
| {{#if: || }}
}}{{#switch:
|addlarchives|addlpages= {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
}}{{#ifeq: {{#invoke:Str|find|http://chris.prather.org/traits-vs-roles.md.html%7Carchiv}} |-1
|| {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://chris.prather.org/traits-vs-roles.md.html%7C4}}%7Chttp}} |-1
|| {{#switch: {{#invoke:Webarchiv|getdomain|http://chris.prather.org/traits-vs-roles.md.html }}
| abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org =
| #default = {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
}}
}}
}}</ref>
- Rust<ref>Rust Reference Manual: Traits</ref>
- Scala
- Self
Weblinks
- Traits: Composable Units of Behavior Auswahl von Artikeln über Traits (englisch)
Einzelnachweise
<references />