blob: 008a3e238192d2054d43ff19c1457bab15f05ac7 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_UI_LIB_ESCHER_BASE_TRAIT_H_
#define SRC_UI_LIB_ESCHER_BASE_TRAIT_H_
namespace escher {
// This class serves to document a C++ design pattern which extends the idea of
// a pure interface by adding non-virtual methods which are defined in terms of
// pure virtual methods that subclasses are required to implement.
//
// For example, a RectangleTrait adds the ability to compute an area to any
// class that can provide a width and a height:
//
// class RectangleTrait {
// public:
// float area() const { return width() * height(); }
//
// private:
// virtual float width() const = 0;
// virtual float height() const = 0;
// };
//
// The key feature of this design pattern is its statelessness (i.e. the trait
// class has no instance variables), and is therefore safe to use with multiple
// inheritance, for the same reasons it is safe for a class to implement several
// pure virtual interfaces.
//
// NOTE: Being unaware of an idiomatic name for this C++ pattern, we take the
// name from an analogous language feature first introduced in Squeak, and soon
// popularized in Scala: http://scg.unibe.ch/research/traits.
class Trait {
protected:
virtual ~Trait() = default;
};
} // namespace escher
#endif // SRC_UI_LIB_ESCHER_BASE_TRAIT_H_