大幅に異なるプログラミング言語が、しかし、最終的な分析では、彼らのデザインのアイデア以上のものは2つの質問に答えるしないように:
1、どのように情報を表現します。
2、どのように情報を処理します。
機能
関数は、完了コードのいくつかの機能のために独立して使用されます。関数型関数と呼ばれるオブジェクトのタイプです。この関数はまた、も別の関数へのパラメータとして定義することができ、変数として定義することができることを意味します。
bool isZero(int number) => number == 0;
void printInfo(int number, Function check) => print("$number is Zero: ${check(number)}");
関数本体の表現の1行だけ、あなたは矢印の機能を使用できるようJavaScript言語としての機能を簡素化する場合
伝達関数パラメータを複数必要とすることができます。呼び出し側のコストを削減しながら、どのようにパラメータ宣言などの機能は、保守性、よりエレガントになって作るには?
C ++およびJavaのアプローチは、同じ名前が、異なる機能パラメータを提供関数のオーバーロードを提供することです。しかし、ダートは過負荷には混乱を招く可能性がありますので、設計の最初から重い負荷をサポートしていますが、名前のオプションおよびオプションのパラメータを提供していますしないと思います。
bool isZero(int number) => number == 0; void printInfo(int number, Function check) => print("$number is Zero: ${check(number)}"); // 要达到可选命名参数的用法,那就在定义函数的时候给参数加上{} void enableFlagsA({bool bold, bool hidden}) => print("$bold, $hidden"); // 定义可选命名参数时增加默认值 void enableFlagesB({bool bold = true, bool hidden = false}) => print("$bold, $hidden"); // 可忽略的参数在函数定义时用[]符号指定 void enableFlagesC(bool bold, [bool hidden]) => print("$bold, $hidden"); // 定义可忽略参数时增加默认值 void enableFlagesD(bool bold, [bool hidden = false]) => print("$bold, $hidden");
カテゴリ
クラスは、オブジェクトは、テンプレートを作成することで、特定のタイプのデータとメソッドのコレクションです。
定義と初期化クラス
ダーツは、オブジェクト指向言語で、クラスの各オブジェクトのインスタンスである、トップレベルタイプのオブジェクトから継承されています。が先行した変数やメソッドを、宣言するときに限りダートや公共ない、保護された、プライベートこれらのキーワードは、_
いない場合は、民間の方法として使用することができ_
、デフォルトはpublicです。しかし、_
制限は、アクセスのレベルが、ライブラリー・アクセス・レベルを好きではありません。
class Point {
num x, y;
static num factor = 0;
// 语法糖,等同于在函数体内:this.x = x; this.y = y; Point(this.x, this.y); void printInfo() => print('($x,$y)'); static void printZValue() => print('$factor'); }
時には、インスタンス化は、様々なパラメータに応じて、クラスの初期化方法を必要としています。ネーミングおよびオプションのパラメータに任意の添加に加えて、また、ダーツのコンストラクタは、そのような意味クラスのインスタンス化プロセスの明確な名前が付けられていました。
また、C ++、ダートサポートの初期化リストに似ています。コンストラクタの実行の実際の身体だけでなく、インスタンス変数を割り当て、さらに別のコンストラクタにリダイレクトする機会の前に。
class Point {
num x, y, z;
Point(this.x, this.y) : z = 0; // 初始化变量z Point.bottom(num x) : this(x, 0); // 重定向构造函数 void printInfo() => print('($x, $y, $z)'); } var p = Point.bottom(100); p.printInfo(); // 输出(100,0,0)
多重化
親クラスおよびインタフェースの継承:このクラスの多重方式にオブジェクト指向プログラミング言語、および変数の他のクラスにおいては、二つの一般的な方法があります。
ダートでは、同じ親クラスに継承やインターフェースすることができます。
- 親クラスを継承することは、親クラスから派生したサブクラスは、自動的に実装サブクラスの親クラスのメンバ変数やメソッドは、親クラスのコンストラクタとメソッドをオーバーライドする必要があり得ることを意味します。
- インタフェース手段は、唯一のメンバー変数やメソッドのシンボルシンボルインタフェースをサブクラスを取得するために、我々はそうでない場合、コンパイラは文句を言うだろう、メンバ変数を再実装、および宣言とメソッドを初期化する必要があります。
class Point {
num x = 0, y = 0; void printInfo() => print('($x, $y)'); } // Vector 继承自 Point class Vector extends Point { num z = 0; @override void printInfo() => print('($x,$y,$z)'); // 覆写了printInfo实现 } // Coordinate 是对 Point 的接口实现 class Coordinate implements Point { num x = 0, y = 0; // 成员变量需要重新声明 void printInfo() => print('($x, $y)'); // 成员函数需要重新声明实现 } var xxx = Vector(); xxx ..x = 1 ..y = 2 ..z = 3; // 级联运算符,等同于 xxx.x = 1; xxx.y = 2; xxx.z = 3; xxx.printInfo(); // 输出(1,2,3) var yyy = Coordinate(); yyy ..x = 1 ..y = 2; // 级联运算符,等同于 yyy.x = 1; yyy.y = 2; yyy.printInfo(); // 输出 (1,2) print(yyy is Point); // true print(yyy is Coordinate); // true
継承とインターフェースに加えて、ダートはまた、コードの再利用を促進するために、混合(ミックスイン)すなわち「混合」多重クラスを達成するための別のメカニズムを提供する、インターフェースはメソッドの実装を有すると見なすことができます。ダートは、原因となる可能性があるため、多重継承に(ダイヤモンドの問題)だけでなく、サポート多重継承の欠如の問題を解決することができますが、また、あいまいさを避けるために。
使用するには、単にキーワードで、混入。
class Coordinate with Point { } var yyy = Coordinate(); yyy ..x = 1 ..y = 2; // 级联运算符,等同于 yyy.x = 1; yyy.y = 2; yyy.printInfo(); // 输出 (1,2) print(yyy is Point); // true print(yyy is Coordinate); // true
見ることができ、混合することにより、クラスが他のクラスに変数やメソッドを使用する方法を継承することはできません。
演算子
除いて、プログラミング言語と同じオペレータの大半をダーツ、ダートは、さらにいくつかの追加のオペレータより、例えばプロセス変数欠失(すなわち、NULL)場合を簡素化します。
- ?。演算子:PointクラスがPRINTINFO()メソッドは、pはポイントがnullの可能性がある例である場合。だから、セキュリティコードP方式のメンバーを呼び出し、Pに減らすことができますか?.PrintInfo()、pはNUL時間がスキップ表現され、例外をスローしないようにします。
- ?? =演算子:スキップそうでない場合、値を割り当てるために、nullの場合。これは、ダートたちができる= ??によって表される値で、デフォルト値の割り当てのすべての詳細を明らかにしました。
- ??演算子:非NULLの場合、戻り値は、それ以外の場合、B。JavaやC ++で、我々は表現のトリプレット必要?。:bが、これを達成するために(A =ヌルを!)ダートでは、そのようなコードは?? bに簡略化することができます。
ダートでは、すべてがオペレータの一部でも、オブジェクトのメンバー関数であり、オブジェクトです。
システムオペレータの場合、一般的にのみ基本的なタイプと標準ライブラリで使用可能なデータ型をサポートしています。ユーザー定義クラスの場合。あなたは、このような大きさ等の比較、加算減算、などの基本操作を、サポートしたい場合は、ユーザーは、この演算子のために独自の具体的な実装を定義する必要があります。
ダートオペレータオーバーライドメカニズムはC ++に似て提供されるので、私たちは、メソッドをオーバーライドすることはできませんあなたもオーバーライドしたり、カスタム演算子をすることができます。
class Vector {
num x, y;
Vector(this.x, this.y); // 自定义相加运算符,实现向量相加 Vector operator + (Vector v) => Vector(x + v.x, y + v.y); // 覆写相等运算符,判断向量相等 bool operator == (dynamic v) => x == v.x && y == v.y; } final x = Vector(3,3); final y = Vector(2,2); final z = Vector(1,1); print(x==(y+z)); // 输出 true