七
七宗罪
Unregistered / Unconfirmed
GUEST, unregistred user!
微软的.net推出了这么长时间,而且微软的MSR也推出了支持泛型编程的CLI,不知道
富翁们,有没有感兴趣的,欢迎大家讨论。
using System;
namespace GenericExample
{
abstract class E<R>
{ // R = result type
abstract public R eval();
}
class Lit<R> : E<R>
{
private readonly R v;
public Lit(R v)
{
this.v = v;
}
public override R eval()
{
return v;
}
}
abstract class Bin<S,R> : E<R>
{ // S = subexpr type;
R = result type
protected readonly E<S> e1, e2;
public Bin(E<S> e1, E<S> e2)
{
this.e1 = e1;
this.e2 = e2;
}
}
class Add : Bin<int,int>
{
public Add(E<int> e1, E<int> e2) : base(e1, e2) { }
public override int eval()
{
return e1.eval() + e2.eval();
}
}
class Eq<S> : Bin<S,bool>
{ // S = subexpr type
public Eq(E<S> e1, E<S> e2) : base(e1, e2) { }
public override bool eval()
{
return e1.eval().Equals(e2.eval());
}
}
class And : Bin<bool,bool>
{
public And(E<bool> e1, E<bool> e2) : base(e1, e2) { }
public override bool eval()
{
return e1.eval() &&
e2.eval();
}
}
// Exercising the encoding
class Phantom
{
// Build the expression n + ... + 1 + 0
static E<int> sum(int n)
{
if (n == 0)
return new Lit<int>(0);
else
return new Add(new Lit<int>, sum(n-1));
}
static void Main()
{
E<int> e1 = sum(40);
E<bool> e1Eq55 = new Eq<int>(new Lit<int>(55), e1);
E<bool> e1Ne55 = new Eq<bool>(new Lit<bool>(false), e1Eq55);
Console.WriteLine(e1.eval() + " " + e1Eq55.eval() + " " + e1Ne55.eval());
E<string> e2 = new Lit<string>("foo");
// typesafe, no confusion possible
}
}
}
富翁们,有没有感兴趣的,欢迎大家讨论。
using System;
namespace GenericExample
{
abstract class E<R>
{ // R = result type
abstract public R eval();
}
class Lit<R> : E<R>
{
private readonly R v;
public Lit(R v)
{
this.v = v;
}
public override R eval()
{
return v;
}
}
abstract class Bin<S,R> : E<R>
{ // S = subexpr type;
R = result type
protected readonly E<S> e1, e2;
public Bin(E<S> e1, E<S> e2)
{
this.e1 = e1;
this.e2 = e2;
}
}
class Add : Bin<int,int>
{
public Add(E<int> e1, E<int> e2) : base(e1, e2) { }
public override int eval()
{
return e1.eval() + e2.eval();
}
}
class Eq<S> : Bin<S,bool>
{ // S = subexpr type
public Eq(E<S> e1, E<S> e2) : base(e1, e2) { }
public override bool eval()
{
return e1.eval().Equals(e2.eval());
}
}
class And : Bin<bool,bool>
{
public And(E<bool> e1, E<bool> e2) : base(e1, e2) { }
public override bool eval()
{
return e1.eval() &&
e2.eval();
}
}
// Exercising the encoding
class Phantom
{
// Build the expression n + ... + 1 + 0
static E<int> sum(int n)
{
if (n == 0)
return new Lit<int>(0);
else
return new Add(new Lit<int>, sum(n-1));
}
static void Main()
{
E<int> e1 = sum(40);
E<bool> e1Eq55 = new Eq<int>(new Lit<int>(55), e1);
E<bool> e1Ne55 = new Eq<bool>(new Lit<bool>(false), e1Eq55);
Console.WriteLine(e1.eval() + " " + e1Eq55.eval() + " " + e1Ne55.eval());
E<string> e2 = new Lit<string>("foo");
// typesafe, no confusion possible
}
}
}