C# 使用基指针调用方法的优点
我在基类中实现了一个方法,如下所示:C# 使用基指针调用方法的优点,c#,C#,我在基类中实现了一个方法,如下所示: class A { protected void f1() { } } class A1 : A { public void f2() { //Simple Calling f1(); //Calling using base pointer base
class A
{
protected void f1()
{
}
}
class A1 : A
{
public void f2()
{
//Simple Calling
f1();
//Calling using base pointer
base.f1();
}
}
简单调用和使用基指针调用有什么区别?这两种方法的优点是什么?在这种情况下,没有。但想象一下:
class A
{
public virtual void F()
{
}
}
class B : A
{
public override void F()
{
Console.WriteLine("B");
}
public void F2()
{
F(); /*output: B*/
base.F() /*no output*/
}
}
这就是base开始变得有用的地方。当您重写虚拟方法时,this.f1或干脆f1与base.f1之间的区别变得相关:
class A
{
public virtual void F()
{
Console.WriteLine("A");
}
}
class B : A
{
public override void F()
{
Console.WriteLine("B");
}
void Test()
{
F(); // Prints "B"
this.F(); // Prints "B"
base.F(); // Prints "A"
}
}
只有在重载/隐藏了基类中定义的方法时,它才有用
class A1 : A
{
public void f2()
{
//Simple Calling
f1();
//Calling using base pointer
base.f1();
}
protected new void f1()
{
// I won't be called
}
}
当链接构造函数时,或者当您希望访问成员方法、属性、基类中已在当前类中重写或隐藏的任何内容时,base关键字用于引用基类。 比如说,
class A {
protected virtual void Foo() {
Console.WriteLine("I'm A");
}
}
class B : A {
protected override void Foo() {
Console.WriteLine("I'm B");
}
public void Bar() {
Foo();
base.Foo();
}
}
根据这些定义
new B().Bar();
将输出
I'm B
I'm A
如果覆盖f1,则需要使用它来区分它们
class A
{
protected virtual void f1() { }
}
class A1 : A
{
protected override void f1() { }
public void f2()
{
//Simple Calling
f1(); <--- this will call to overrided f1 in this class
//Calling using base pointer
base.f1();
}
}
在你的例子中没有区别。但是,考虑F1是虚拟的情况,它在A1类中有另一种实现: f1不同于base.f1。使用new关键字在派生类中隐藏基实现时也会出现相同的情况:
protected new void f1()
{
Console.WriteLine("A1");
}
当您想扩展基本方法的功能,但不想复制它时,也很有用:
class A
{
public virtual void F()
{
Console.WriteLine("A");
}
}
class B : A
{
public override void F()
{
base.F();
Console.WriteLine("B");
}
void Test()
{
F(); // Prints "A B"
}
}
快速提示-除非您使用不安全的代码,否则默认情况下C中不存在指针,您基本上使用的是base关键字。在B类中F不应该标记为override而不是virtual吗?@MarcinJuraszek是的,我的错。
class A
{
public virtual void F()
{
Console.WriteLine("A");
}
}
class B : A
{
public override void F()
{
base.F();
Console.WriteLine("B");
}
void Test()
{
F(); // Prints "A B"
}
}