使用基指针调用方法的优点

本文关键字:方法 调用 指针 | 更新日期: 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();
    }
}