さらにあがいてみる
public class AnyObject : List{ public AnyObject() { } public AnyObject(int data) { this.data = data; } public int data; public void Select(Selector anSelector, Executor anExecutor) { foreach (AnyObject anAnyObject in this) { if (anSelector(anAnyObject)) { anExecutor(anAnyObject); } } } } public delegate bool Selector (T anObject); public delegate void Executor (T anObject);
使い方はこんな感じ。
AnyObject anAnyObject = new AnyObject(); anAnyObject.Add(new AnyObject(0)); anAnyObject.Add(new AnyObject(1)); anAnyObject.Add(new AnyObject(2)); anAnyObject.Add(new AnyObject(3)); anAnyObject.Add(new AnyObject(4)); anAnyObject.Add(new AnyObject(5)); //実際に使ってみる。 anAnyObject.Select( delegate(AnyObject anAnyObject2) { return (anAnyObject2.data % 2) == 0; }, delegate(AnyObject anAnyObject3) { Console.WriteLine(anAnyObject3.data); } );
なんかこう、すでによく判らない領域にたどり着いてるような……。
何も知らないC#プログラマが見たら卒倒しそうなコードですね。
改行がSmalltalkに比べて多めなので、無理矢理改行を取っ払うとこんな感じ。
anAnyObject.Select(delegate(AnyObject anAnyObject2){return (anAnyObject2.data % 2) == 0;}, delegate(AnyObject anAnyObject3){Console.WriteLine(anAnyObject3.data);});
いい線まで来てるような。ぬぐいきれない違和感はCやJavaの文法に長いこと浸っていた所為だろうなぁ。