オブジェクト指向言語の特徴とDartの基礎

Flutterを使ったアプリ開発 プログラミング

今回は、Dartが含まれる、オブジェクト指向言語の特徴について説明します。

はじめに

Dartは、JavaやC#と違い、1つのファイルの中で複数のモジュールを作成できます。

プライベートClass、変数

Javaと異なり、Dartではアクセス制限をつけるのにpublic、protected、privateなどのキーワードを使いません。Dartでは、名前の最初に_(アンダースコア)をつけることで、privateとなるのです。つまり、今までこのように書いていたのですが、

main(){
  private String name;
  private String phone;
}

これではエラーが出てしまい、下のようにして使うということです。

main(){
  String _name;
  String _phone;
}

コンストラクタ

デフォルトコンストラクタ

Dartでは、コンストラクタを定義しないと、自動でデフォルトコンストラクタが作成されます。

コンストラクタ構文のショートカット

インスタンス変数に値をセットするのに、「this.[インスタンス変数名]」という分を使うことができます。

class Name{
  String firstName;
  String lastName;
  
  Name(this.firstName, this.lastName);
}
main(){
  Name name = new Name('mark','smith');
  print(name.firstName);
  print(name.lastName);
}
mark
smith

Newキーワード

Dartはコンストラクタを呼び出す際に、「New」キーワードは必要ありません。(使いたい場合は使うこともできます)

void main(){
  Car car = Car('BMW','M3');
  print(car.getBadge());
  
  Car car2 = new Car('BMW','M3');
  print(car2.getBadge());
}
  
  
  
class Car{
  String _make;
  String _model;
  
  Car(this._make, this._model){}
  
  String getBadge(){
    return _make + '-' + _model;
  }
}
BMW-M3
BMW-M3

名前付きコンストラクタ

Dartでは、コンストラクタ名.[好きな名前]とすることで、複数のコンストラクタを定義することができます。Javaでいうオーバーロードの代わりとして使えます。

class ProcessingResult{
  bool _error;
  String _errorMessage;
  
  ProcessingResult.success(){
    _error = false;
    _errorMessage = '';
  }
  
  ProcessingResult.failure(this._errorMessage){ //shortcut
    this._error = true;
  }
  
  String toString(){
    return 'Error: ' + _error.toString() + ' Message: ' + _errorMessage;
  }
}

void main(){
  print(ProcessingResult.success().toString());
  print(ProcessingResult.failure('it broke').toString());
}
Error: false Message: 
Error: true Message: it broke

コンストラクタのパラメータ

コンストラクタは、メソッドと同様、異なる方のパラメータを持つことができます。

factoryコンストラクタ

新しいインスタンスを作らない可能性がある場合、factoryというキーワードを使うことができます。factoryは、最後に変数を返すことができます。以下に例を示します。

class Printer{
  static final Printer _singleton = Printer._construct();
  
  factory Printer(){
    return _singleton;
  }
  
  Printer._construct(){
    print('private constructor');
  }
  
  PrintSomething(String text){
    print(text);
  }
  
}

void main(){
  Printer().PrintSomething("this");
  Printer().PrintSomething("and");
  Printer().PrintSomething("that");
}
private constructor
this
and
that

インスタンス変数

アクセス制限を明示しない場合

変数の制限を明示しない場合、変数はpublicとして作成されます。

class Name{
  String firstName;
  String lastName;
}

デフォルト値

変数のデフォルト値はnullです。

コンストラクタとメソッドのパラメータ

Flutterはコンストラクタやメソッドのパラメータについて、とても柔軟で、以下3つの種類があります。

  1. 必要
  2. あってもなくてもよい
  3. 名前付き

必要

まずは、パラメータが必要なものです。

class Car{
  String _make;
  String _model;
  Car(this._make,this._model){}
}

あってもなくてもよい

次は、パラメータがあってもなくてもよいものです。これは、パラメータを[]で囲うことで明示します。

値を入れなかった場合はnullが入ります。

void main(){
  Car car1 = Car("Nissan","350Z");
  Car car2 = Car("Nissan");
}

class Car{
  String _make;
  String _model;
  Car(this._make,[this._model]){
    print('${_make} ${_model}');
  }
}
Nissan 350Z
Nissan null

名前付き

名前付きのパラメータはすべてあってもなくてもよいものです。これは、パラメータの最後に定義します。

これも、値が入れられなかった場合、nullが入ります。

void main(){
  Car car1 = Car("Nissan",model:"350Z",color:"yellow");
  Car car2 = Car("Nissan",color:"red");
  Car car3 = Car("Nissan");
}

class Car{
  String make;
  String model;
  String color;
  Car(this.make,{this.model,this.color}){
    print('${make} ${getOptional(model)} ${getOptional(color)}');
  }
  
  String getOptional(String str){
    return str == null?"" : ""+str;
  }
}
Nissan 350Z yellow
Nissan  red
Nissan  

requiredデコレータ

「@required」をつけることで、名前付きパラメータを必須にすることができます。この機能は、DartではなくFrutterの機能であるため、Dartpadでは動きません。

インターフェイス

Dartは暗黙的インターフェイスを持ちます。

名前の通り、Dartではすべてのクラスは暗黙的にインターフェイスを持ち、それを公開しています。

他に

Method Cascades

Method Cascadesは、簡潔なコードを書くのに役立ちます。

class Logger{
  void log(dynamic v){
    print(DateTime.now().toString() + ' ' + v);
  }
}

main(){
  
  //method cascades 未使用
  new Logger().log('program started');
  new Logger().log('doing something');
  new Logger().log('program finished');
  
  //method cascades使用
  new Logger()
    ..log('program started')
    ..log('doing something')
    ..log('program finished');
}
2020-04-01 04:02:55.572 program started
2020-04-01 04:02:55.572 doing something
2020-04-01 04:02:55.572 program finished
2020-04-01 04:02:55.572 program started
2020-04-01 04:02:55.572 doing something
2020-04-01 04:02:55.577 program finished
タイトルとURLをコピーしました