Skip to content

Instantly share code, notes, and snippets.

@akehoyayoi
Created August 15, 2018 22:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akehoyayoi/fa0201c1881feafd5f22cb812fb99939 to your computer and use it in GitHub Desktop.
Save akehoyayoi/fa0201c1881feafd5f22cb812fb99939 to your computer and use it in GitHub Desktop.
mixin example
class TreeControl[T] {
// これらのIFを使いたい
dataNodes: T[];
def getLevel(node: T): Int = {}
}
class NestedTreeControl[T] extends TreeControl[T] {}
class FlatTreeControl[T] extends TreeControl[T] {}
trait TreeControlEnhancer[T] {
self: TreeControl[T] => // ここで自己型解決しておけば
def getParent(node: T): T = {
val currentLevel = getLevel(node); // TreeControl.getLevelが使える
...
}
}
// TreeControlEnhancerを使うときは下記のような書き方でOK
val treeControl = new NestedTreeControl[Type] with TreeControlEnhancer[Type]
@kohashi
Copy link

kohashi commented Aug 17, 2018

型情報が落ちてもいいならこんなんでできるはず。

// これは上のScalaをTSにしただけなので読み飛ばしてOK -----
class TreeControl<T> {
  // これらのIFを使いたい
  dataNodes: T[]; 
  getLevel(node: T): number { return 9999; }
}

class NestedTreeControl<T> extends TreeControl<T> {}
class FlatTreeControl<T> extends TreeControl<T> {}


// ここから -----
function getParent<T>(node: T) {
  const self = this as TreeControl<T>; // ここで自己型解決
  const currentLevel = self.getLevel(node);
}


const treeControl = new NestedTreeControl<string>();
treeControl['getParent'] = getParent;
treeControl['getParent'](); // 使える!&型情報はない!

@kohashi
Copy link

kohashi commented Aug 17, 2018

型情報が必要なら、以下の2つしか無いはず

  1. 素直に継承なりラッパークラスなりにする
  2. trait用のクラスを定義 & implements する(クラスを継承でなくインターフェイスとして利用) & voidを返すメソッドを仮定義 & prototypeに代入することで実装を得る…。
    これは TSのページに MixIn として紹介されてるやつそのものですね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment