2013-10-22 222 views
1

我有一個關於C#中繼承的問題。我有一個定義受保護虛擬成員的公共抽象類A.我有另一個從A繼承的抽象類B,然後是從B繼承的另一個內部類C.第一個類A位於單獨的名稱空間中,另外兩個位於相同的名稱空間中,但包含對第一個類的引用。從抽象類繼承C#

我試圖使用base關鍵字訪問C中的A的受保護虛擬成員,但我無法除非我在B中提供方法,然後在那裏調用A的受保護虛擬成員。

我想知道我正在嘗試做什麼是可能的,即我做錯了什麼?或者如果它不可能,那爲什麼? 謝謝。

下面的代碼示例:

namespace A 
    { 

    public abstract class BaseClass 
    { 
     protected virtual string GetData() 
     { 
      //code to get data 
     } 
    } 
    } 

    namespace B //includes a reference to A 
    { 
    abstract class DerivedClassA : BaseClass 
    { 

    } 


    internal class DerivedClassB: DerivedClassA 
    { 
      public void write() 
      { 
      base.GetData(); // results in error. 

      // The name 'GetData' does not exist in the current context 
      // and DerivedClassA does not contain a definition for 'GetData' 
      } 
    } 
+2

你應該包括一個你想要做的事情的小代碼示例。這會更容易理解。 –

+0

@JoelGauvreau由於這裏的層次結構非常簡單,我不覺得需要提供代碼示例。它與我所描述的幾乎一樣。 – Setafire

+3

你所描述的將會工作得很好。這可能是您的代碼中的錯誤。除非我們看到它,否則我們不知道它是什麼。你說你「無法」,這是什麼意思?你有一個編譯器或運行時錯誤?如果是這樣,哪一個? –

回答

0

得到了問題的根源。顯然,第二個命名空間所指的dll的位置已經改變,因此它指向了一個過時的引用。在我從正確的位置更新引用之後,它運行良好。感謝所有的幫助。

3

除了命名空間問題your code ran fine,有一件事我不得不改變是

abstract class DerivedClassA : A.BaseClass 
{ 

} 

變化DerivedClassA我懷疑是什麼BaseClass被稱爲您的真實項目在名稱空間B或您的代碼頂部的using聲明中包含的某些其他名稱空間中有一個同名的類。例如,這將recreate your error

namespace A 
    { 

    public abstract class BaseClass 
    { 
     protected virtual string GetData() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
    } 

    namespace B //includes a reference to A 
    { 
    public abstract class BaseClass 
    { 
    } 


    abstract class DerivedClassA : BaseClass 
    { 

    } 


    internal class DerivedClassB: DerivedClassA 
    { 
      public void write() 
      { 
      base.GetData(); // results in error. 

      // The name 'GetData' does not exist in the current context 
      // and DerivedClassA does not contain a definition for 'GetData' 
      } 
    } 
    } 

檢查你沒有使用相同的名稱BaseClass另一個命名空間或DerivedClassA

+0

我檢查了一下,我的第二個命名空間中沒有任何其他類的名稱爲BaseClass。另外,當我將鼠標懸停在DerivedClassA簽名中的BaseClass名稱上時,它向我顯示正確的名稱空間。在它之前添加命名空間路徑也沒有任何區別。 – Setafire

+0

您確定您已將範圍正確地複製到您的示例中嗎?你有沒有添加「公共」或「受保護」? –

0

這對我的作品明確定義的BaseClass的命名空間。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Protectedmemberinabstractclassex 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 
} 
namespace A 
{ 

    public abstract class BaseClass 
    { 
     protected virtual string GetData() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

namespace B //includes a reference to A 
{ 


    abstract class DerivedClassA : A.BaseClass 
    { 

    } 


    internal class DerivedClassB : DerivedClassA 
    { 
     public void write() 
     { 
      base.GetData(); 
     } 
    } 
}