In computer programming, a trait is a concept used in object-oriented programming, which represents a set of methods that can be used to extend the functionality of a class.
Traits both provide a set of methods that implement behaviour to a class, and require that the class implements a set of methods that parameterize the provided behaviour.
For inter-object communication (and sharing between objects), traits are somewhat between an object-oriented protocol (interface) and a mixin. An interface may define one or more behaviors via method signatures, while a trait defines behaviors via full method definitions: i.e., it includes the body of the methods. In contrast, mixins include full method definitions and may also carry state through member variable, while traits usually don't.
Hence an object defined as a trait is created as the composition of methods, which can be used by other classes without requiring multiple inheritance. In case of a naming collision, when more than one trait to be used by a class has a method with the same name, the programmer must explicitly disambiguate which one of those methods will be used in the class; thus manually solving the diamond problem of multiple inheritance. This is different from other composition methods in object-oriented programming, where conflicting names are automatically resolved by scoping rules.
Whereas mixins can be composed only using the inheritance operation, traits offer a much wider selection of operations, including:
- symmetric sum: an operation that merges two disjoint traits to create a new trait
- override (or asymmetric sum): an operation that forms a new trait by adding methods to an existing trait, possibly overriding some of its methods
- alias: an operation that creates a new trait by adding a new name for an existing method
- exclusion: an operation that forms a new trait by removing a method from an existing trait. (Combining this with the alias operation yields a shallow rename operation).
Traits are composed in the following ways:
- Trait composition is commutative; the ordering of adding traits does not matter. For example, given trait S = A + B, then trait T = B + A is the same as S.
- Conflicting methods are excluded from the composition.
- Nested traits are equivalent to flattened traits; the composition hierarchy does not affect the traits behaviour. For example, given trait S = A + X, where X = B + C, then trait T = A + B + C is the same as S.
Traits come originally from the programming language Self and are supported by the following programming languages:
- AmbientTalk: Combines the properties of Self traits (object-based multiple inheritance) and Smalltalk's Squeak traits (requiring explicit composition of traits by the programmer). It builds on the research on stateful and freezable traits to enable state within traits, which was not allowed in the first definitions.
- C++: Used in Standard Template Library and the C++ standard library to support generic container classes and in the Boost TypeTraits library.
- Curl: Abstract classes as mixins permit method implementations and thus constitute traits by another name.
- D: Since version 2.003, the __traits language extension and std.traits module helper templates provide compile-time traits. Together with other language features (notably templates and mixins), they allow flexible automatic generation of methods based on interfaces and types. D also allows explicit aliasing of member methods and variables, including forwarding to multiple member classes.
- ECMAScript: Since Edition 8 (June 2017)
- Groovy: Since version 2.3
- Haxe: Since version 2.4.0. Called Static Extension in the manual, it uses
- Java: Since version 8, Java has support for default methods, which have some properties of traits.
- Julia: Several packages implement traits, e.g., 
- Kotlin: Traits have been called interfaces since M12.
- Perl: Called roles, they are implemented in Perl 5 libraries such as Moose, Role::Tiny and Role::Basic. Roles are part of the language in Perl 6.
- PHP: Since version 5.4, PHP allows users to specify templates that provide the ability to "inherit" from more than one (trait-)class, as a pseudo multiple inheritance.
- Python: Via a third-party library, or via higher-order mixin classes
- Racket: Supports traits as a library and uses macros, structures, and first-class classes to implement them.
- Ruby: Module mixins can be used to implement traits.
- Scala trait is builtin supported with the key word
- Smalltalk: Traits are implemented in two dialects of Smalltalk, Squeak and Pharo.
- Swift: Traits can be implemented with protocol extensions.
This example uses a trait to enhance other classes:
// The template
private static $_instance = null;
public static function getInstance
if (null === self::$_instance)
self::$_instance = new self;
// Can also be used in already extended classes
class WebSite extends SomeClass
This allows simulating aspects of multiple inheritance:
public $x, $y, $width, $height;
public function moveTo($x, $y)
public function resize($newWidth, $newHeight)
use TBounding, TMoveable, TResizeable;
public function fillColor($color)
- ^ a b c Schärli, Nathanael; Ducasse, Stéphane; Nierstrasz, Oscar; Black, Andrew P. (2003). "Traits: Composable Units of Behaviour" (PDF). Proceedings of the European Conference on Object-Oriented Programming (ECOOP). Lecture Notes in Computer Science. Springer-Verlag. 2743: 248-274.
- ^ Ducasse, Stéphane; Nierstrasz, Oscar; Schärli, Nathanael; Wuyts, Roel; Black, Andrew P. (March 2006). "Traits: A mechanism for fine-grained reuse". ACM Transactions on Programming Languages and Systems. 28 (2): 331-388. doi:10.1145/1119479.1119483.
- ^ Fisher, Kathleen; Reppy, John (2003). "Statically typed traits" (PDF). University of Chicago. Archived (PDF) from the original on May 17, 2004.
- ^ Fisher, Kathleen; Reppy, John (2004). A typed calculus of traits (PDF). 11th Workshop on Foundations of Object-oriented Programming. University of Chicago.
- ^ Curry, Gael; Baer, Larry; Lipkie, Daniel; Lee, Bruce (1982). Traits: An approach to multiple-inheritance subclassing. SIGOA Conference on Office Information Systems. Philadelphia, Pennsylvania, USA: ACM Press. pp. 1-9.
- ^ Van Cutsem, Tom; Bergel, Alexandre; Ducasse, Stéphane; De Meuter, Wolfgang (2009). Adding State and Visibility Control to Traits Using Lexical Nesting (PDF). European Conference on Object-Oriented Programming (ECOOP 2009). Lecture Notes in Computer Science. 5653. Springer-Verlag. pp. 220-243. doi:10.1007/978-3-642-03013-0_11. ISBN 978-3-642-03012-3.
- ^ "iterator_traits<Iterator>". Standard Template Library. SGI.
- ^ Myers, Nathan C. (June 1995). "Traits: a new and useful template technique". C++ Report. Retrieved 2016.
- ^ Abrahams, David. "Generic Programming Techniques: Traits". Boost C++ Libraries. Retrieved 2016.
- ^ "Traits". The D Language Reference. Digital Mars. Retrieved 2016.
- ^ "std.traits". The D Language -- Library Reference. Digital Mars. Retrieved 2016.
- ^ "Classes". The D Language Reference. Digital Mars. Retrieved 2016.
- ^ "ECMAScript 2017 Language Specification (ECMA-262, 8th edition)". Ecma International. June 2017.
- ^ Steele, Guy; Maessen, Jan-Willem (June 11, 2006). "Fortress Programming Language Tutorial" (PDF). Sun Microsystems. Retrieved 2016.
- ^ "Object Orientation: Traits". The Groovy Programming Language. Retrieved 2016.
- ^ "Haxe 2.4.0 - Haxe - The Cross-platform Toolkit". Haxe - The Cross-platform Toolkit. Retrieved .
- ^ "Manual - Haxe - The Cross-platform Toolkit". Haxe - The Cross-platform Toolkit. Retrieved .
- ^ "Default Methods". The Java Tutorials. Oracle. Retrieved 2016.
- ^ Bono, Viviana; Mensa, Enrico; Naddeo, Marco (September 2014). Trait-oriented Programming in Java 8. International Conference on Principles and Practices of Programming on the Java Platform: virtual machines, languages, and tools (PPPJ '14). Kraków, Poland.
- ^ "Java 8 default methods as traits: safe?". Quora. February 23, 2015. Retrieved 2016.
- ^ Forslund, Emil (February 3, 2016). "Definition of the Trait Pattern in Java". Age of Java. Retrieved 2016.
- ^ "CocktailJS". Retrieved 2016.
- ^ mauro3. "SimpleTraits.jl". Retrieved 2017.
- ^ "Interfaces". Kotlin Reference. JetBrains. Retrieved 2016.
- ^ Breslav, Andrey (May 29, 2015). "Kotlin M12 is out!". Kotlin Blog. JetBrains. Retrieved 2016.
- ^ "Traits". Lasso Language Guide. LassoSoft. January 6, 2014. Retrieved 2016.
- ^ chromatic (April 30, 2009). "The Why of Perl Roles". Retrieved 2016.
- ^ "Traits". PHP Documentation. The PHP Group. Retrieved 2016.
- ^ Marr, Stefan (January 9, 2011). "Request for Comments: Horizontal Reuse for PHP". PHP.net wiki. The PHP Group. Retrieved 2011.
- ^ Perä, Teppo. "py3traits Documentation". Retrieved 2016.
- ^ Perä, Teppo. "py2traits". Retrieved 2016.
- ^ "Higher Order Mixin Classes".
- ^ "Traits". The Racket Reference. Retrieved 2016.
- ^ David Naseby (February 14, 2004). "Traits in Ruby". Ruby Naseby. Retrieved 2016.
- ^ "Traits". The Rust Programming Language. Retrieved 2016.
- ^ "Traits". A Tour of Scala. École polytechnique fédérale de Lausanne. Retrieved 2016.
- ^ Neward, Ted (April 29, 2008). "The busy Java developer's guide to Scala: Of traits and behaviors". IBM developerWorks. IBM. Retrieved 2016.
- ^ "Traits in 10 minutes". Pharo: The CollaborActive Book. Retrieved 2016.
- ^ Hollemans, Matthijs (July 22, 2015). "Mixins and Traits in Swift 2.0". Retrieved 2016.