Trait (computer programming)


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.

Characteristics

Traits both provide a set of methods that implement behaviour to a class, and require that the class implement a set of methods that parameterize the provided behaviour.
For inter-object communication, traits are somewhere between an object-oriented protocol 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:
Traits are composed in the following ways:
Traits come originally from the programming language Self and are supported by the following programming languages:

C#

On C# 8.0, it is possible to define an implementation as a member of an interface.
using System;
namespace CSharp8NewFeatures

PHP

This example uses a trait to enhance other classes:

// The template
trait TSingleton
class FrontController
// Can also be used in already extended classes
class WebSite extends SomeClass

This allows simulating aspects of multiple inheritance:

trait TBounding
trait TMoveable
trait TResizeable
class Rectangle

Rust

A trait in Rust declares a set of methods that a type must implement. Rust compilers require traits to be explicated, which ensures the safety of generics in Rust.

// type T must have the "Ord" trait
// so that ">" and "<" operations can be done
fn get_max -> Option<&T>

To simplify tedious and repeated implementation of traits like Debug and Ord, derive can be used to request compilers to generate certain implementations automatically. Derivable traits include: Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord and Hash.