1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C# 虚方法 重写方法和抽象方法

C# 虚方法 重写方法和抽象方法

时间:2022-10-02 08:08:40

相关推荐

C# 虚方法 重写方法和抽象方法

可使用虚方法、重写方法和抽象方法来定义类类型层次结构的行为。

由于类可从基类派生,因此这些派生类可能需要修改在基类中实现的行为。

虚方法是在基类中声明和实现的方法,其中任何派生类都可提供更具体的实现。

重写方法是在派生类中实现的方法,可修改基类实现的行为。

抽象方法是在基类中声明的方法,必须在所有派生类中重写。

事实上,抽象方法不在基类中定义实现。

对实例方法的方法调用可解析为基类或派生类实现。 变量的类型确定了其编译时类型。 编译时类型是编译器用于确定其成员的类型。 但是,可将变量分配给从其编译时类型派生的任何类型的实例。 运行时间类型是变量所引用的实际实例的类型。

调用虚方法时,为其调用方法的实例的运行时类型 决定了要调用的实际方法实现代码。 调用非虚方法时,实例的编译时类型 是决定性因素。

可以在派生类中重写虚方法。 如果实例方法声明中有override 修饰符,那么实例方法可以重写签名相同的继承虚方法。 虚方法声明引入了新方法。

重写方法声明通过提供现有继承的虚方法的新实现,专门针对该方法。

抽象方法是没有实现代码的虚方法。 抽象方法使用 abstract 修饰符进行声明,仅可在抽象类中使用。 必须在所有非抽象派生类中重写抽象方法。

下面的示例声明了一个抽象类 Expression ,用于表示表达式树节点;还声明了三个派生类( Constant 、VariableReference 和 Operation ),用于实现常量、变量引用和算术运算的表达式树节点。

public abstract class Expression{public abstract double Evaluate(Dictionary<string, object> vars);}public class Constant : Expression{double _value;public Constant(double value){_value = value;}public override double Evaluate(Dictionary<string, object> vars){return _value;}}public class VariableReference : Expression{string _name;public VariableReference(string name){_name = name;}public override double Evaluate(Dictionary<string, object> vars){object value = vars[_name] ?? throw new Exception($"Unknown variable: {_name}");return Convert.ToDouble(value);}}public class Operation : Expression{Expression _left;char _op;Expression _right;public Operation(Expression left, char op, Expression right){_left = left;_op = op;_right = right;}public override double Evaluate(Dictionary<string, object> 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;default: throw new Exception("Unknown operator");}}}

以下程序使用 Expression 类根据不同的 x 和 y 值计算表达式 x * (y + 2) 。

Expression e = new Operation(new VariableReference("x"),'*',new Operation(new VariableReference("y"),'+',new Constant(2)));Dictionary<string, object> vars = new Dictionary<string, object>();vars["x"] = 3;vars["y"] = 5;Console.WriteLine(e.Evaluate(vars)); // "21"vars["x"] = 1.5;vars["y"] = 9;Console.WriteLine(e.Evaluate(vars)); // "16.5"

方法重载

借助方法 重载 ,同一类中可以有多个同名的方法,只要这些方法具有唯一签名即可。 编译如何调用重载的方法时,编译器使用 重载决策 来确定要调用的特定方法。 重载决策会查找与自变量匹配度最高的一种方法。 如果找不到任何最佳匹配项,则会报告错误。 下面的示例展示了重载决策的实际工作方式。 UsageExample 方法中每个调用的注释指明了调用的方法。

class OverloadingExample{static void F() => Console.WriteLine("F()");static void F(object x) => Console.WriteLine("F(object)");static void F(int x) => Console.WriteLine("F(int)");static void F(double x) => Console.WriteLine("F(double)");static void F<T>(T x) => Console.WriteLine("F<T>(T)");static void F(double x, double y) => Console.WriteLine("F(double, double)");public static void UsageExample(){F(); // Invokes F()F(1); // Invokes F(int)F(1.0); // Invokes F(double)F("abc"); // Invokes F<string>(string)F((double)1); // Invokes F(double)F((object)1); // Invokes F(object)F<int>(1); // Invokes F<int>(int)F(1, 1); // Invokes F(double, double)}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。