Merkmal (Computerprogrammierung)

Im Computerprogrammierung, a Merkmal ist ein Konzept in verwendet in Objekt orientierte Programmierung was einen Satz von darstellt Methoden Das kann verwendet werden, um die Funktionalität von a zu erweitern Klasse.[1][2]

Eigenschaften

Merkmale bieten beide eine Reihe von Methoden, die Verhalten für eine Klasse implementieren, und erfordern, dass die Klasse eine Reihe von Methoden implementiert, die Parametrize das bereitgestellte Verhalten.

Für die Kommunikation zwischen den Objekten liegen Merkmale irgendwo zwischen einem objektorientierten Objekt aus Protokoll (Schnittstelle) und ein mischen. Eine Schnittstelle kann ein oder mehrere Verhaltensweisen über definieren MethodensignaturenWährend ein Merkmal Verhalten durch vollständige Methodendefinitionen definiert: d. H. Es enthält das Körper der Methoden. Im Gegensatz dazu enthalten Mixins vollständige Methodendefinitionen und können auch tragen Zustand durch Mitgliedsvariable, obwohl Eigenschaften normalerweise nicht.

Daher wird ein als Merkmal definierter Objekt als das erstellt Komposition von Methoden, die von anderen Klassen ohne erforderlich sind Mehrfacherbe. Im Falle von a Benennung von KollisionWenn mehr als ein Merkmal von einer Klasse eine Methode mit demselben Namen hat, muss der Programmierer explizit disambiguieren, welche dieser Methoden in der Klasse verwendet werden. somit manuell die Lösung des Diamantproblem von mehreren Vererbung. Dies unterscheidet sich von anderen Zusammensetzungsmethoden in der objektorientierten Programmierung, bei denen widersprüchliche Namen automatisch durch behoben werden Scoping -Regeln.

Während Mixins nur mit dem komponiert werden können Nachlass Betrieb, Merkmale bieten eine viel größere Auswahl an Operationen, einschließlich:[3][4]

  • Symmetrische Summe: Eine Operation, die zwei disjunkte Eigenschaften verschmilzt, um ein neues Merkmal zu erstellen
  • überschreiben (oder Asymmetrische Summe): eine Operation, die ein neues Merkmal bildet, indem Methoden zu einem vorhandenen Merkmal hinzugefügt werden, möglicherweise überschreiben Einige seiner Methoden
  • alias: Eine Operation, die ein neues Merkmal erstellt, indem ein neuer Name für eine vorhandene Methode hinzugefügt wird
  • Ausschluss: Eine Operation, die ein neues Merkmal bildet, indem eine Methode aus einem vorhandenen Merkmal entfernt wird. (Kombinieren Sie dies mit dem Alias ​​-Betrieb liefert a flach umbenannt Betrieb).

Merkmale werden auf folgende Weise komponiert:

  • Die Zusammensetzung der Merkmale ist kommutativ; Die Bestellung des Hinzufügens von Eigenschaften spielt keine Rolle. Zum Beispiel gegebenes Merkmal S = A + Bdann Merkmal T = B + A ist das gleiche wie S.
  • Widersprüchliche Methoden sind von der Zusammensetzung ausgeschlossen.
  • Verschachtelte Merkmale entsprechen abgeflachte Merkmale; Die Kompositionshierarchie wirkt sich nicht auf das Verhalten des Merkmals aus. Zum Beispiel gegebenes Merkmal S = A + X, wo X = B + Cdann Merkmal T = A + B + C ist das gleiche wie S.[1]

Unterstützte Sprachen

Merkmale stammen ursprünglich aus der Programmiersprache Selbst[5] und werden von den folgenden Programmiersprachen unterstützt:

  • Ambienttalk: Kombiniert die Eigenschaften von Selbstmerkmalen (objektbasierte Multiple Vererbung) und Smalltalk's Quietschen Merkmale (die explizite Zusammensetzung von Merkmalen des Programmierers erfordern). Es baut auf der Forschung auf Staatsbürgerlich und eisiger Merkmale, um Staat innerhalb von Merkmalen zu ermöglichen, was in den ersten Definitionen nicht zulässig war.[6]
  • C#: Seit Version 8.0 hat C# Unterstützung für Standard -Schnittstellenmethoden,[7] die einige Eigenschaften von Merkmalen haben.[8]
  • C ++: Benutzt in Standard -Vorlagenbibliothek und die C ++ Standardbibliothek Generikum unterstützen Containerklassen[9][10] und in der Schub Typetraits Library.[11]
  • Locken: Abstrakte Klassen als Mixins erlauben Methodenimplementierungen und bilden daher Merkmale nach einem anderen Namen.
  • D: Seit Version 2.003 die Spracherweiterung __traits[12] und Std.Traits -Modul[13] Helfervorlagen liefern Kompilierungs-Zeitmerkmale. Zusammen mit anderen Sprachmerkmalen (insbesondere Vorlagen und Mixins) ermöglichen sie eine flexible automatische Erzeugung von Methoden, die auf Schnittstellen und Typen basieren. D ermöglicht auch ein explizites Aliasing von Mitgliedermethoden und Variablen, einschließlich der Weiterleitung an mehrere Mitgliedsklassen.[14]
  • Festung[15]
  • Groovig: Seit Version 2.3[16]
  • Haskell: In Haskell sind Merkmale als bekannt als als bekannt Geben Sie Klassen ein.
  • Haxe: Seit Version 2.4.0.[17] Genannt Statische Erweiterung[18] Im Handbuch verwendet es Verwendung Stichwort
  • Java: Seit Version 8 hat Java Unterstützung für Standardmethoden,[19] die einige Eigenschaften von Merkmalen haben.[20][21][22][23]
  • JavaScript: Merkmale können über Funktionen und Delegationen implementiert werden[24] oder durch Bibliotheken, die Eigenschaften bieten.[25][26][27]
  • Julia: Mehrere Pakete implementieren Merkmale, z. B.,[28]
  • Kotlin: Merkmale wurden genannt Schnittstellen[29] Seit M12.[30]
  • Lasso[31]
  • Ocaml: Merkmale können unter Verwendung einer Vielzahl von Sprachmerkmalen implementiert werden: Modul- und Modul -Typeinschluss, Functors und Functor -Typen, Klassen- und Klassentyp -Vererbung usw.
  • Perl: Genannt Rollen, sie werden in Perl -Bibliotheken implementiert, z. Elch, Rolle :: Tiny and Rolle :: Basic. Rollen sind Teil der Schwestersprache Raku.[32]
  • Php: Seit Version 5.4,[33][34] Mit PHP können Benutzer Vorlagen angeben, die die Möglichkeit bieten, als Pseudo von mehr als einer (Merkmal-) Klasse zu "erben" Mehrfacherbe.
  • Python: Über eine Bibliothek von Drittanbietern,[35][36] oder über Mixinklassen höherer Ordnung[37]
  • Schläger: Unterstützt Merkmale als Bibliothek und verwendet Makros, Strukturen und erstklassige Klassen, um sie zu implementieren.[38]
  • Rubin: Modulmischungen kann verwendet werden, um Merkmale zu implementieren.[39]
  • Rost[40]
  • Scala[41][42] Das Merkmal wird mit dem Schlüsselwort unterstützt Merkmal.
  • Smalltalk: Merkmale werden in zwei Dialekten von SmallTalk implementiert. Quietschen[1] und Pharo.[43]
  • Schnell: Merkmale können mit implementiert werden mit Protokollverlängerungen.[44]

Beispiele

C#

Auf C# 8.0 ist es möglich, eine Implementierung als Mitglied einer Schnittstelle zu definieren.

Verwendung System; Namespace CSHARP8NewFeatures; Schnittstelle Iloogger {  // herkömmliche Schnittstellenmethoden  Leere Protokoll(Saite Botschaft);  Leere Logelror(Ausnahme Ausnahme);  // Standard -Schnittstellenmethode  Leere Logwarning(Saite Botschaft)  {  Konsole.Schreiben(Botschaft);  }         } Klasse Logger : Iloogger {  Öffentlichkeit Leere Protokoll(Saite Botschaft)  {  Konsole.Schreiben(Botschaft);  }  Öffentlichkeit Leere Logelror(Ausnahme Ausnahme)  {  Konsole.Schreiben(Ausnahme.Tostring());  } } Klasse Programm {  statisch Leere Hauptsächlich(Saite[] Args)  {  Iloogger Logger = Neu Logger();  Logger.Logwarning("Eine Warnmeldung");  } } 

Php

In diesem Beispiel wird ein Merkmal verwendet, um andere Klassen zu verbessern:

// Die Vorlage Merkmal Tsingleton {  Privatgelände statisch $ _instance = Null;  Privatgelände Funktion __konstruieren() {} // muss einen privaten Standardkonstruktor haben und sich bewusst sein, ihn nicht in der Klasse zu öffnen  Öffentlichkeit statisch Funktion bekomme Instanz()  {  wenn (Null === selbst::$ _instance) {  selbst::$ _instance = Neu selbst();  }  Rückkehr selbst::$ _instance;  } } Klasse Frontcontroller {  verwenden Tsingleton; } // kann auch in bereits erweiterten Klassen verwendet werden Klasse Webseite erweitert Someclass {  verwenden Tsingleton; } 

Dies ermöglicht die Simulation von Aspekten der multiplen Vererbung:

Merkmal Tbounding {  Öffentlichkeit $ x, $ y, $ width, $ Höhe; } Merkmal Tmovable {  Öffentlichkeit Funktion ziehen nach($ x, $ y)  {  //…  } } Merkmal Tressizelbar {  Öffentlichkeit Funktion Größenänderung($ newwidth, $ newheight)  {  //…  } } Klasse Rechteck {  verwenden Tbounding, Tmovable, Tressizelbar;  Öffentlichkeit Funktion Füllfarbe($ Farbe)  {  //…  } } 

Rost

Ein Merkmal in Rost erklärt eine Reihe von Methoden, die ein Typ implementieren muss.[45] Rost -Compiler erfordern Merkmale, die erläutert werden müssen, was die Sicherheit von gewährleistet Generika im Rost.

// Typ t muss das "ord" -Reit haben // damit ">" und "<" -Operationen ausgeführt werden können fn Max<T: Ord>(a: &[T])) -> Möglichkeit<&T> {   Lassen Mut Ergebnis = a.Erste()?;   zum n in a {   wenn *n > *Ergebnis {   Ergebnis = &n;   }   }   Etwas(Ergebnis) } 

Um die mühsame und wiederholte Implementierung von Merkmalen wie zu vereinfachen Debuggen und Ord, das ableiten Makro kann verwendet werden, um Compiler zu fordern, bestimmte Implementierungen automatisch zu generieren.[46] Ableitbare Eigenschaften umfassen: Klon, Kopieren, Debuggen, Standard, Partiale, Gl, Partialord, Ord und Hash.

Siehe auch

Verweise

  1. ^ a b c Schärli, Nathanael; Dukasse, Stéphane; Nierstrasz, Oscar; Black, Andrew P. (2003). "Merkmale: komponierbare Verhaltenseinheiten" (PDF). Verfahren der Europäischen Konferenz über objektorientierte Programmierung (ECOOP). Vorlesungsnotizen in Informatik. Springer. 2743: 248–274. Citeseerx 10.1.1.1011.8. doi:10.1007/978-3-540-45070-2_12. ISBN 978-3-540-45070-2.
  2. ^ Dukasse, Stéphane; Nierstrasz, Oscar; Schärli, Nathanael; Wuyts, Roel; Black, Andrew P. (März 2006). "Merkmale: Ein Mechanismus für die feinkörnige Wiederverwendung". ACM -Transaktionen zu Programmiersprachen und Systemen. 28 (2): 331–388. Citeseerx 10.1.1.64.2480. doi:10.1145/1119479.1119483.
  3. ^ Fisher, Kathleen; Reppy, John (2003). "Statisch getippte Merkmale" (PDF). Universität von Chicago. Archiviert (PDF) Aus dem Original am 17. Mai 2004. {{}}: Journal zitieren erfordert |journal= (Hilfe)
  4. ^ Fisher, Kathleen; Reppy, John (2004). Ein typisierter Berechnungskalkül von Merkmalen (PDF). 11. Workshop zu Grundlagen der objektorientierten Programmierung. Universität von Chicago.
  5. ^ Curry, Gael; Baer, ​​Larry; Lipkie, Daniel; Lee, Bruce (1982). Merkmale: Ein Ansatz zur Subklasse mit mehreren Inheritanz. SIGOA -Konferenz für Büroinformationssysteme. Philadelphia, Pennsylvania, USA: ACM Press. S. 1–9. doi:10.1145/966873.806468.
  6. ^ Van Cutsem, Tom; Bergel, Alexandre; Dukasse, Stéphane; De Meuter, Wolfgang (2009). Hinzufügen von Zustands- und Sichtbarkeitskontrolle zu Merkmalen mit lexikalischen Verschachteln (PDF). Europäische Konferenz über objektorientierte Programmierung (ECOOP 2009). Vorlesungsnotizen in Informatik. Vol. 5653. Springer-Verlag. S. 220–243. Citeseerx 10.1.1.372.1265. doi:10.1007/978-3-642-03013-0_11. ISBN 978-3-642-03012-3.
  7. ^ "Standard -Schnittstellenmethoden". Was ist neu in C# 8.0. Microsoft. Abgerufen 29. November, 2019.
  8. ^ "Schnittstellen in C# 8.0 erhalten eine Umarbeitung". Standardimplementierung in Schnittstellen in C# 8.0. Sprechend dotnet. Abgerufen 29. November, 2019.
  9. ^ "iterator_traits <Iterator>". Standard -Vorlagenbibliothek. SGI.
  10. ^ Myers, Nathan C. (Juni 1995). "Merkmale: Eine neue und nützliche Vorlagentechnik". C ++ - Bericht. Abgerufen 23. Januar, 2016.
  11. ^ Abrahams, David. "Generische Programmierungstechniken: Merkmale". Steigern Sie C ++ - Bibliotheken. Abgerufen 23. Januar, 2016.
  12. ^ "Züge". Die D -Sprachreferenz. Digital Mars. Abgerufen 23. Januar, 2016.
  13. ^ "std.traits". Die D -Sprache - Bibliotheksreferenz. Digital Mars. Abgerufen 23. Januar, 2016.
  14. ^ "Klassen". Die D -Sprachreferenz. Digital Mars. Abgerufen 23. Januar, 2016.
  15. ^ Steele, Kerl; Maessen, Januar-Willem (11. Juni 2006). "Fortress -Programmiersprache Tutorial" (PDF). Sun Microsystems. Abgerufen 23. Januar, 2016.
  16. ^ "Objektorientierung: Merkmale". Die groovige Programmiersprache. Abgerufen 23. Januar, 2016.
  17. ^ "Haxe 2.4.0 - Haxe - das plattformübergreifende Toolkit". Haxe - das plattformübergreifende Toolkit. Abgerufen 2017-09-12.
  18. ^ "Handbuch - Haxe - das plattformübergreifende Toolkit". Haxe - das plattformübergreifende Toolkit. Abgerufen 2017-09-12.
  19. ^ "Standardmethoden". Die Java -Tutorials. Orakel. Abgerufen 23. Januar, 2016.
  20. ^ Liquori, Luigi; Spiwack, Arnaud (2008). "Federtrait: Eine bescheidene Erweiterung des Federgewichts -Java". ACM -Transaktionen zu Programmiersprachen und Systemen. doi:10.1145/1330017.1330022.
  21. ^ Liquori, Luigi; Spiwack, Arnaud (2008). "Federtrait Java mit Schnittstellen erweitern". Theoretische Informatik. doi:10.1016/j.tcs.2008.01.051.
  22. ^ Bono, Viviana; Mensa, Enrico; Naddeo, Marco (September 2014). Merkmalsorientiertes Programmieren in Java 8. Internationale Konferenz über Prinzipien und Praktiken der Programmierung auf der Java -Plattform: Virtuelle Maschinen, Sprachen und Tools (PPPJ ’14). S. 181–6. Citeseerx 10.1.1.902.161. doi:10.1145/2647508.2647520.
  23. ^ Forslund, Emil (3. Februar 2016). "Definition des Merkmalsmusters in Java". Alter von Java. Archiviert von das Original am 4. August 2016. Abgerufen 3. Februar, 2016.
  24. ^ Seliger, Peter (11. April 2014). "Die vielen Talente von JavaScript". Abgerufen 23. Januar, 2015.
  25. ^ "Merkmale.JS: Merkmale für JavaScript". Abgerufen 23. Januar, 2016.
  26. ^ Van Cutsem, Tom; Miller, Mark S. (2012). "Robustes Merkmalzusammensetzung für JavaScript" (PDF). Wissenschaft der Computerprogrammierung. Abgerufen 23. Januar, 2016.
  27. ^ "Cocktailjs". Abgerufen 23. Januar, 2016.
  28. ^ Mauro3. "SimpleTraits.jl". Abgerufen 23. März, 2017.
  29. ^ "Schnittstellen". Kotlin Referenz. Jetbrains. Abgerufen 23. Januar, 2016.
  30. ^ Breslav, Andrey (29. Mai 2015). "Kotlin M12 ist raus!". Kotlin -Blog. Jetbrains. Abgerufen 23. Januar, 2016.
  31. ^ "Züge". Lasso Language Guide. Lassosoft. 6. Januar 2014. Abgerufen 23. Januar, 2016.
  32. ^ Chromatisch (30. April 2009). "Das Warum der Perl -Rollen". Abgerufen 23. Januar, 2016.
  33. ^ "Züge". PHP -Dokumentation. Die PHP -Gruppe. Abgerufen 23. Januar, 2016.
  34. ^ Marr, Stefan (9. Januar 2011). "Anfrage nach Kommentaren: Horizontale Wiederverwendung für PHP". Php.net Wiki. Die PHP -Gruppe. Abgerufen 31. Januar, 2011.
  35. ^ Perä, Teppo. "PY3RAITS -Dokumentation". Abgerufen 23. Januar, 2016.
  36. ^ Perä, Teppo (2015-03-25). "py2traits". Abgerufen 23. Januar, 2016.
  37. ^ "Mixinklassen höherer Ordnung". Archiviert von das Original Am 2016-10-09.
  38. ^ "Züge". Die Schlägerreferenz. Abgerufen 23. Januar, 2016.
  39. ^ David Naseby (14. Februar 2004). "Merkmale in Ruby". Ruby Naseby. Abgerufen 23. Januar, 2016.
  40. ^ "Züge". Die Rost -Programmiersprache. Abgerufen 30. September, 2019.
  41. ^ "Züge". Eine Tour durch Scala. École Polytechnique Fédérale de Lausanne. Abgerufen 23. Januar, 2016.
  42. ^ Neward, TED (29. April 2008). "Der geschäftige Leitfaden des Java -Entwicklers zu Scala: von Merkmalen und Verhaltensweisen". IBM Developerworks. IBM. Abgerufen 23. Januar, 2016.
  43. ^ "Merkmale in 10 Minuten". Pharo: Das kollaboraktive Buch. Abgerufen 23. Januar, 2016.
  44. ^ Hollemans, Matthijs (22. Juli 2015). "Mixins und Merkmale in Swift 2.0". Abgerufen 23. Januar, 2016.
  45. ^ "Merkmale - Einführung in das Programmieren mit Rost".
  46. ^ "Merkmale - die Rost -Programmiersprache".

Externe Links