章节 错误!使用“开始”选项卡将 Heading 1 应用于要在此处显示的文字。 错误!使用“开始”选项卡将 Heading 1 应用于要在
public class Operation: Expression {
Expression left; char op;
Expression right; }
public Operation(Expression left, char op, Expression right) { this.left = left; this.op = op;
this.right = right; }
public override double Evaluate(Hashtable vars) { double x = left.Evaluate(vars); double y = right.Evaluate(vars); switch (op) {
case '+': return x + y; case '-': return x - y; case '*': return x * y; case '/': return x / y; }
throw new Exception(\}
上面的四个类可用于为算术表达式建模。例如,使用这些类的实例,表达式 x + 3 可如下表示。
Expression e = new Operation( new VariableReference(\ '+',
new Constant(3));
代码中调用了 Expression 实例的 Evaluate 方法,以计算给定表达式的值,从而生成一个 double 值。该方法接受一个包含变量名称(作为哈希表项的键)和值(作为项的值)的 Hashtable 作为实参。Evaluate 方法是一个虚抽象方法,意味着非抽象派生类必须重写该方法以提供实际的实现。
Constant 的 Evaluate 实现只是返回所存储的常量。VariableReference 的实现在哈希表中查找变量名称,并返回产生的值。Operation 的实现先对左操作数和右操作数求值(通过递归调用它们的 Evaluate 方法),然后执行给定的算术运算。
下面的程序使用 Expression 类,对于不同的 x 和 y 值,计算表达式 x * (y + 2) 的值。
using System;
using System.Collections; class Test {
static void Main() {
Expression e = new Operation( new VariableReference(\ '*',
new Operation(
new VariableReference(\ '+',
new Constant(2) ) );
Hashtable vars = new Hashtable(); vars[\vars[\
Console.WriteLine(e.Evaluate(vars));
// Outputs \
版权所有 ? Microsoft Corporation 1999-2012。保留所有权利。
19
C# LANGUAGE SPECIFICATION
}
vars[\ vars[\
Console.WriteLine(e.Evaluate(vars)); }
// Outputs \
1.6.6.5 方法重载
方法重载 (overloading) 允许同一类中的多个方法具有相同名称,条件是这些方法具有唯一的签名。在编译一个重载方法的调用时,编译器使用重载决策 (overload resolution) 确定要调用的特定方法。重载决策将查找与参数最佳匹配的方法,如果没有找到任何最佳匹配的方法则报告错误信息。下面的示例演示重载决策的工作机制。Main 方法中的每个调用的注释表明实际调用的方法。
class Test {
static void F() {
Console.WriteLine(\ } }
static void F(object x) {
Console.WriteLine(\}
static void F(int x) {
Console.WriteLine(\}
static void F(double x) {
Console.WriteLine(\}
static void F
Console.WriteLine(\}
static void F(double x, double y) {
Console.WriteLine(\}
static void Main() {
F(); // Invokes F() F(1); // Invokes F(int) F(1.0); // Invokes F(double) F(\ // Invokes F(object) F((double)1); // Invokes F(double) F((object)1); // Invokes F(object) F
F(1, 1); // Invokes F(double, double) }
正如该示例所示,总是通过显式地将实参强制转换为确切的参数类型和/或显式地提供类型实参,来选择一个特定的方法。 1.6.7 其他函数成员
包含可执行代码的成员统称为类的函数成员 (function member)。前一节描述的方法是函数成员的主要类型。本节介绍了 C# 支持的其他类型的函数成员:构造函数、属性、索引器、事件、运算符和析构函数。 下表演示一个名为 List
20
版权所有 ? Microsoft Corporation 1999-2012。保留所有权利。
章节 错误!使用“开始”选项卡将 Heading 1 应用于要在此处显示的文字。 错误!使用“开始”选项卡将 Heading 1 应用于要在
public class List
版权所有 ? Microsoft Corporation 1999-2012。保留所有权利。
21
C# LANGUAGE SPECIFICATION
public T this[int index] { get { return items[index]; } set { items[index] = value; OnChanged(); } } 索引器 public void Add(T item) { if (count == Capacity) Capacity = count * 2; items[count] = item; count++; OnChanged(); } protected virtual void OnChanged() { if (Changed != null) Changed(this, EventArgs.Empty); } public override bool Equals(object other) { return Equals(this, other as List
1.6.7.1 构造函数
C# 支持两种构造函数:实例构造函数和静态构造函数。实例构造函数 (instance constructor) 是实现初始化类实例所需操作的成员。静态构造函数 (static constructor) 是一种用于在第一次加载类本身时实现其初始化所需操作的成员。
构造函数的声明如同方法一样,不过它没有返回类型,并且它的名称与其所属的类的名称相同。如果构造函数声明包含 static 修饰符,则它声明了一个静态构造函数。否则,它声明的是一个实例构造函数。 实例构造函数可以被重载。例如,List
List
22
版权所有 ? Microsoft Corporation 1999-2012。保留所有权利。
相关推荐: