【声明：本文没有贬低某个编程语言的意思】

Please Note: 2005/10/14
I found some friends republished this post and forget keep the original information, so please:

1. Please don't forget keep the original address in your post.
2. Please don't modify it.

Thanks.

Example： Foo(+, 1, 2) = 3; Foo(*, 3, 6) = 18; Foo(/, 2, 4) = 0.5

Ceer最先作出反应：简单嘛，判断一下输入的操作符就好了。说着，他很快在白板上写出如下代码：
public class CStyle_Calculator
{
static public double Foo(char op, double x, double y)
{
switch(op)
case '+': return x + y; break;
case '-': return x - y; break;
case '*': return x * y; break;
case '/': return x / y; break;
default: throw new Exception(”What the Hell you have input?");
}
}

Jally只看了一遍，就捂着鼻子连连摇头：好一股的代码臭味【注1】。还不如看我用OO的方法来解决：
public interface I操作符 //谁说代码不能写中文的？恩恩
{
double 运算(double x, double y);
}

public class OO_Calculator
{
private I操作符 m_op;
public OO_Calculator(I操作符 op)
{
this.m_op = op; //依赖注入【注2】
}

public double Foo(double x, double y)
{
return this.m_op.运算(x, y);
}
}

public class 加法:I操作符
{
public double 运算(double x, double y)
{
return x + y;
}
}

public class 减法:I操作符
{
public double 运算(double x, double y)
{
return x - y;
}
}

public class 乘法:I操作符
{
public double 运算(double x, double y)
{
return x * y;
}
}

public class 除法:I操作符
{
public double 运算(double x, double y)
{
return x / y;
}
}

public class TheMainClass
{
static public void Main()
{
I操作符 我的加法 = new 加法();
OO_Calculator 我的加法器 = new OO_Calculator(我的加法);
double sum  = 我的加法器.Foo(3, 4);
System.Console.WriteLine(sum);
//sum = 7

//其他3个我就不废话了
}
}

public delegate double TheOperator(double x, double y);

public class Operators
{
static public double Add(double x, double y)
{
return x + y;
}

static public double Sub(double x, double y)
{
return x - y;
}

//乘，除法 我也懒得废话了
}

public class DotNet_Calculator
{
public double Foo(TheOperator op, double x, double y)
{
return op(x, y);
}
}

public class TheMainClass
{
static public void Main()
{
TheOperator myAdd = new TheOperator(Operators.Add);
TheOperator mySub = new TheOperator(Operators.Sub);

DotNet_Calculator dc = new DotNet_Calculator();
double sum = dc.Foo(myAdd, 2, 4); //sum = 6
System.Console.WriteLine(sum);
double sub = dc.Foo(mySub, 3, 7); //sub = -4
System.Console.WriteLine(sub);
}
}
//dot net 下面还可以用CodeDom动态构造C＃代码，然后在内存编译运行。
//如果觉得专门写个Operators很烦的话，可以试试C＃2.0的匿名方法

“然则DotNet下面的Delegate是类型安全滴...”你继续洋洋得意.

(define (Foo op x y)
(op x y))

【注： scheme的代码稍微解释下：(+ 1 2) = 3, (* 3 4) = 12.】

(define (Foo op x y)
(op x y))

“Pascal是为了建造金字塔...Lisp是为了建造有机体...”“作为Lisp的内在数据结构，表对于这种可用性起着重要的提升作用...”“采用100函数在一个数据结构上操作，远远优于采用10个操作在十个数据结构上工作”“金字塔矗立在那里千年不变，而有机体则必须演化，否则就会消亡”。

Java 语言中的函数编程(偶FP的入门贴。查叔叔，我膜拜您）
http://www.hibernate.org.cn/viewtopic.php?t=7569&postdays=0&postorder=asc&start=0

Lambda Calculus
http://www.mactech.com/articles/mactech/Vol.07/07.05/LambdaCalculus/

Java 语言中的函数编程
http://www-128.ibm.com/developerworks/cn/java/j-fp/

【注1】

【注2】
Flower的依赖注入模式，Ioc容器啥的是这里来的