覆盖函数c#
我只是试图使用控制台应用程序来掌握虚拟function的概念。 我注意到,一旦覆盖基类函数, 返回baseclassname.functionname(parameters)就会自动插入到我的函数体中。 为什么会这样?
class advanc { public virtual int calc (int a , int b) { return (a * b); } } class advn : advanc { public override int calc(int a, int b) { //automatically inserted return base.calc(a, b); } }
通过重写虚函数,可以扩展基类的function,然后调用基类来实现“基本function”。
如果要删除’ return base.calc(a,b)
‘行,则不会执行基类代码。
如果要完全替换function,这不是问题,但如果要扩展function,则还应调用基类。
以下代码演示了这一点(只需将其放在控制台应用程序中)
class advanc { public virtual int calc(int a, int b) { Console.WriteLine("Base function called"); return (a * b); } } class advn : advanc { public bool CallBase { get; set; } public override int calc(int a, int b) { Console.WriteLine("Override function called"); if (CallBase) { return base.calc(a, b); } else { return a / b; } } } private static void Main() { advn a = new advn(); a.CallBase = true; int result = a.calc(10, 2); Console.WriteLine(result); a.CallBase = false; result = a.calc(10, 2); Console.WriteLine(result); Console.WriteLine("Ready"); Console.ReadKey(); }
Visual Studio试图猜测你想要什么,所以它建议你这个代码。
有时,重写的函数会扩展基类函数的function。 在这种情况下,在被覆盖的内部的某处调用base.function
是可行的。
这意味着当它调用base.calc时,它将调用它覆盖的父函数。 如果你不想调用基本function你可以删除它,但在大多数情况下它将保留(这就是visual studio auto生成它的原因)。
如果在高级函数中你不想调用a * b函数,你将删除基函数调用并编写自己的函数。
EG如果你在你的课堂上宣布这个:
public override int calc(int a, int b) { return Math.Pow(a, b); }
调用此function时,您将获得以下内容:
advanc myObj = new advanc(); advn advnObj = new advn(); myObj.calc(5, 2); // will return 10 advnObj.calc(5, 2); // will return 25
IDE正在尝试生成实际编译的最简单的重写方法(所以如果你以后留下实际的实现,你仍然有一段代码不会做太多但仍然编译并产生一个可能不会导致的结果打破你的其余代码)。
此外,在某些情况下,即使在实现之后,对基类的方法的调用也是有意义的:
- 您的子类的行为在基础上扩展但不完全替换它
- 你正在使用装饰器模式,但你的calc方法不需要改变(你仍然需要实现它,因为它是你正在装饰的原始接口的一部分,但你只是将调用转发到你的基类而不改变行为)
IDE只是插入对基本实现的调用。 这意味着,默认情况下,覆盖的行为将与它覆盖的方法相同。 如果这不是所需的行为(可能不是),只需使用您选择的代码重新进行操作即可。
由于行return base.calc(a, b);
自动调用基函数体return base.calc(a, b);
但是,你可以简单地让基本函数体不会被自动调用,并像这样调用你的owen:
class advn : advanc { public override int calc(int a, int b) { return a * b; //anything else; } }
默认情况下,VS提供至少执行父项在函数中执行的操作。 此外,在许多情况下,您需要运行父项,然后执行您的操作(例如,在UI情况下)。 对于base
请参阅MSDN:
base关键字用于从派生类中访问基类的成员:
Call a method on the base class that has been overridden by another method. Specify which base-class constructor should be called when creating instances of the derived class.
仅在构造函数,实例方法或实例属性访问器中允许基类访问。