LoginSignup
28
15

More than 1 year has passed since last update.

Dart abstract(and iterator)

Last updated at Posted at 2018-03-15

abstract class

  • 抽象的なクラスである
  • 抽象的なメソッドを持つことができる
  • new クラス名() はできない
  • ↑により直接propartyをいじることはできない

直接いじること、変更することができないから継承し、その継承したクラスからproparty,methodを実行して、呼び出し、追加、削除などをする

abstract
abstract class Describable {
  void describe();
  void describeWithEmphasis() {
    print('========');
    describe();
    print('========');
  }
}

class MyTitle extends Describable {
  void describe() => {print('mytitle')};
}

class MySubtitle implements Describable {
  void describe() => print("Development Division");
  void describeWithEmphasis() {
    print('********');
    describe();
    print('********');
  }
}

main() {
  new MyTitle().describeWithEmphasis();
  new MySubtitle().describeWithEmphasis();
}

Describable...抽象的なクラス
describe()...抽象的なメソッド
MyTitle,MySubtitile...Describableを継承している(継承のしかたは違う)

extends

継承する抽象クラスの未実装メソッドを実装すること
この場合 describe()(未実装のメソッド)を実装する

implements

実装する抽象クラスのメンバの総てを実装すること
全てのメソッドなのでDescribableで実装されているdescribeWithEmphasisも実装し直さないといけない

イテレーター

イテレーターの理解時にabstractも理解したのでiteratorも説明する

iterator
main() {
  List fruits1 = ['apple', 'pears', 'bananas'];
  Set fruits2 = new Set();
  fruits2.add('grapes');
  fruits2.add('apple');
  fruits2.add('pine');

  Iterator iterator1 = fruits1.iterator;
  Iterator iterator2 = fruits2.iterator;
  while (iterator1.moveNext()) {
    var fruit = iterator.current;
    print('${fruit} is tasty');
  }

  while (iterator2.moveNext()) {
    var fruit = iterator.current;
    print('${fruit} is tasty');
  }
}

イテレーターとは

iterableなオブジェクト(List,Set,dart:collectionでimportするほとんど)の要素一つ一つをloop処理する時によく使われる
fruits1.iterator は fruits1 は Listであり Listはiterableクラスを継承しているクラスであるのでiterableクラスのプロパティであるiteratorを使用可能
ちなみにfruits1.iteratorはgetで返り値はiteratorオブジェクトである。(iteratorもクラス)

自分なりにこのiteratorがどのように動いているか想像しコードにした

iteratorSimulation
abstract class Iterable {
  String iteratorString;
  void setItr(setIterator);

  String get iterator;
  void set iterator(String a);
}

class List extends Iterable {
  setItr(setIterator) {
    iteratorString = setIterator;
  }

  String get iterator => iteratorString;
  void set iterator(String setIterator) {
    setItr(setIterator);
  }
}

main() {
  var newList = new List();
  newList.iterator = 'setting iteratorString';
  print(newList.iterator);
}

iterableという抽象クラスをListクラスが継承しpropartyであるget,set iteratorの抽象メソッドを継承し実装している(直接get,setはabstractだからできないため)
その実装してものをnew List()した後setしてiteratorStringを変更し、getしている

バグ修正

@shinriyo3修正リクエストありがとうございます。おくれてすみませんでした。

28
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
15