2013-08-22 21 views
0

我已經實現在基類中的方法如下的方法:優勢通話使用基本指針

class A 
    { 
     protected void f1() 
     { 

     } 
    } 
    class A1 : A 
    { 
     public void f2() 
     { 
      //Simple Calling 
      f1(); 
      //Calling using base pointer 
      base.f1(); 
     } 

    } 

是什麼調用簡單地之間的差異,使用基類指針調用?這兩種方式的優點是什麼?

+2

默認情況下,C#中不存在快速提示 - 指針(除非使用不安全代碼),則基本上使用'base'關鍵字。 –

回答

1

在這種情況下,沒有。但想象一下:

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開始有用的地方。

+1

在'B'類中'F'不應該被標記爲'override'而不是'virtual'嗎? – MarcinJuraszek

+0

@MarcinJuraszek是的,我的錯。 –

1

之間時覆蓋一個虛擬方法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" 
    } 
} 
1

這是僅在已超載有用/陰影在基類中定義的方法。

class A1 : A 
{ 
    public void f2() 
    { 
     //Simple Calling 
     f1(); 
     //Calling using base pointer 
     base.f1(); 
    } 

    protected new void f1() 
    { 
     // I won't be called 
    } 

} 
0

基礎關鍵字用於鏈接構造時,指基類,或者您希望在已被覆蓋或隱藏在當前類的基類來訪問一個成員(方法,屬性,任何東西) 。 例如,

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 

Reference

0

如果重寫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(); 
    } 

} 
3

在你的例子中沒有區別。然而,考慮情況時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"); 
} 
1

也有用,當你想擴展基本方法的功能,但不希望複製它:

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" 
     } 
    }