使用基指针调用方法的优点
本文关键字:方法 调用 指针 | 更新日期: 2023-09-27 18:28:40
我在基类中实现了一种方法,如下所示:
class A
{
protected void f1()
{
}
}
class A1 : A
{
public void f2()
{
//Simple Calling
f1();
//Calling using base pointer
base.f1();
}
}
简单调用和使用基本指针调用有什么区别?这两种方式的优点是什么?
在您的示例中没有区别。但是,请考虑当f1
是虚拟的并且它在类中具有另一个实现A1
的情况:
class A
{
protected virtual void f1()
{
Console.WriteLine("A");
}
}
class A1 : A
{
public void f2()
{
//Simple Calling - prints `A1`
f1();
//Calling using base pointer - prints `A`
base.f1();
}
protected override void f1()
{
Console.WriteLine("A1");
}
}
f1()
与那时的base.f1()
不同。当您使用 new
关键字隐藏派生类中的基实现时,会出现相同的情况:
protected new void f1()
{
Console.WriteLine("A1");
}
当您覆盖虚拟方法时,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
}
}
当您想要扩展基本方法的功能但又不想复制它时,也很有用:
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"
}
}
在本例中,没有。但想象一下:
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
开始派上用场的地方。
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();
}
}