(Translated by https://www.hiragana.jp/)
Trait (计算机科学) - 维基百科,自由的百科全书 とべ转到内容ないよう

Trait (计算つくえ科学かがく)

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

Traitざいめんこう对象ほどじょ设计なか一个不可实例化(uninstantiable)てき方法ほうほうあずか类型てき集合しゅうごう,为一个对象或算法提供了策略(policy)ある实现自身じしんせっこうてき细节こうのう。trait为类提供ていきょうりょういち套方ほうどう时也意味いみ类必须实现这么一套方ほう

ざいめんこう对象ほどじょ设计なかprotocol、interface、trait、mixin具有ぐゆう类似てき涵义。protocol/interfaceてい义了函数かんすう原型げんけい;trait还定义了方法ほうほうてき完全かんぜん实现;mixinじょりょう方法ほうほうてきかんせい实现,还可以通过成员变りょう保存ほぞんりょうじょう态信いき,而trait通常つうじょうかい如此。论上,traits支持しじいち組合くみあい(composition)操作そうさ

  • ごう并不しょう交的traits(symmetric sum)产生いち个新てきtrait
  • くつがえ盖(asymmetric sum):对一个已ゆうてきtrait增加ぞうか方法ほうほう以覆盖已ゆうてき方法ほうほう
  • 别名(alias): 对已ゆう方法ほうほう增加ぞうか别名,从而产生いち个新てきtrait
  • 排除はいじょ(exclusion):从已ゆうtraitちゅう删除方法ほうほう从而产生いち个新てきtrait
  • はま套的trait动平めんれい如 给定trait S = A + X, 其中 X = B + C, 么trait T = A + B + C とう价于 S

C++编程ちゅうてきtraits[编辑]

C++语言标准ぼつ有定ありさだ义"traits",ただしてい义了"traits class":

17.3.25 [defns.traits] traits class

いち个类,ふうそうりょういち套对类模ばん函数かんすうばん实例时操纵对ぞう类型必须てき类型函数かんすう [ ちゅう释: てい义在Clauses 21, 22 27てきtraits classtraits, 提供ていきょうりょうstringiostream类所需的处理支持しじ。]

C++标准ばん库中大量たいりょう使用しようりょうtraits。はたいん为模いたがたさん包括ほうかつ类型がたさん类型がたまいり不同ふどう而导致的不同ふどう抽取いたしんてきばんそくtraits)ちゅうしかきさきどおり过traitsてきばんとく实现针对具体ぐたいじょう况的优化实现。Traitsさく为模ばん类,すんで声明せいめいりょう统一てきせっこう包括ほうかつ类型、まい举、函数かんすう方法ほうほうとう),また以通过模ばんとく,针对同数どうすうすえ类型ある其他ばんさんすう,为类、函数かんすうあるもの通用つうよう算法さんぽうざいいん使用しようてきすうすえ类型不同ふどう而导致处逻辑不同ふどう时,提供ていきょうりょう区分くぶん不同ふどう类型てき具体ぐたい细节,从而部分ぶぶんようTraits实现てきこうのうあずか其它共同きょうどうてきこうのう区分くぶん开来。れい如,容器ようきてき元素げんそてき不同ふどうすうすえ类型,あるものiostream使用しようchar还是wchar_t。いち个traits包括ほうかつりょうenum、typedef、ばんへんとく(template partial specialization)。其中,enumてい义了かく种类てき标识てき统一表示ひょうじ;typedefてい义了かく个类てき各自かくじ不同ふどうてき类型てい义,这对于使用しよう板元はんもと编程(template meta-programming)てき灵活せい非常ひじょう重要じゅうようばんへんとくよう于实现各个类てき不同ふどうこうのう

しめせれい[编辑]

かり设有一个容器模板类,其包含ほうがん元素げんそてき值类がた以是ないせい(built-in)てきすうすえ类型,也可以是てい义的类。よし此,ゆうてき值类がた支持しじmove操作そうさゆうてき值类がた支持しじmove操作そうさ。该容ばん具有ぐゆう统一てき界面かいめんただし不同ふどうてき值类がた实现りょう不同ふどうてき语义こうのう。为此:

#include <iostream>

struct no_move{};//两个marker类型
struct has_move{};

struct myValueType{
  public: void move(){std::cout<<"move a myValueType obj."<<std::endl;}
};

template <typename T> struct traits{
  typedef no_move move_method; //对于traitsばん类,だま认为无move方法ほうほう
  void move(T* p){}//だま认为无move方法ほうほう
};

template <> struct traits<myValueType>{
  typedef has_move move_method;//对于myValueType,traitsばんへんとくてい义了ゆうmove方法ほうほう
  void move(myValueType* p){p->move();} //ばんとくゆうmove方法ほうほう
};

template <typename T> struct Container{
  void move(T* p){traits<T>().move(p);};
};

int main()
{
  int i=101;
  int *p1=&i;
  myValueType v1;
  myValueType *pv=&v1;
  Container<int> c1;
  Container<myValueType> c2;
  c1.move(p1);
  c2.move(pv);
}

C#てき支持しじ[编辑]

从C# 8.0开始,支持しじかけしょうせっこう方法ほうほう”( default interface methods)。

using System;

namespace CSharp8NewFeatures
{
    interface ILogger
    {
        // Traditional interface methods
        void Log(string message);
        void LogError(Exception exception);

        // Default interface method
        void LogWarning(string message)
        {
            Console.WriteLine(message);
        }        
    }

    class Logger : ILogger
    {
        public void Log(string message)
        {
            Console.WriteLine(message);
        }

        public void LogError(Exception exception)
        {
            Console.WriteLine(exception.ToString());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ILogger logger = new Logger();

            logger.LogWarning("Some warning message");
        }
    }
}

Haskell[编辑]

Haskellちゅう,traitsしょうさく类型类(Type classes).

Java[编辑]

从Java 8开始,支持しじかけしょう方法ほうほう(default method)

JavaScript[编辑]

以通过functionsあずかdelegations实现,あるものどおり支持しじtraitsてき库。

Python[编辑]

つう过第さんぽう库py3traits,あるものだか阶mixin类。