2015-02-24 71 views

回答

7

添加internal構件到public抽象類使得不可能繼承abstract類之外的組件它在被宣佈,但類本身以及所有派生類仍然可以使用(作爲類型public)外宣佈大會。

假設你有一個抽象類:

public abstract AMyClass 
{ 
    public string DoSomething() 
    { 
     return DoSomethingInternal(); 
    } 

    internal abstract string DoSomethingInternal(); 
} 

而且繼承它的另一個公共類,在同一個大會宣佈

public sealed MyClass : AMyClass 
{ 
    internal override string DoSomethingInternal() 
    { 
     return "Hey from MyClass!"; 
    } 
} 

你仍然可以創建不同的組件的的MyClass實例,但是您將無法實施從AMyClass派生的自己的班級,因爲您將無法執行摘要DoSomethingInternal方法。

+0

感謝Marcin的回覆,但是你能否解釋一下你的這些行......但是類聲明程序集之外,類本身以及所有派生類仍然可以使用(因爲類型是公共的)。 – 2015-02-24 05:53:23

6

internal關鍵字是類型和類型成員的訪問修飾符。 內部類型或成員只能訪問內的同一 彙編文件,在這個例子中

public class BaseClass 
{ 
    // Only accessible within the same assembly 
    internal static int x = 0; 
} 

現在你的情況,這是一樣的東西:

public abstract BaseClass 
{ 
    internal abstract void Print(); 
} 

現在,在這種情況下,所有與BaseClass的組件相同的類將能夠覆蓋BaseClass的Print方法。但是在大會之外的課程只能覆蓋公衆成員。像

public abstract BaseClass 
{ 
    internal abstract void Print(); 
    public abstract void Hello(); 
} 

的BaseClass的組件的外面的類將不能夠使用這個類作爲此類的成員是內部的。解決方案是在BaseClass的相同程序集中創建子類,並在程序集外部使用該類。

我建議你在c#中深入閱讀c#中的訪問修飾符概念。

+0

感謝Mukund,但是在做了一個內部的抽象方法之後,我無法在程序集外派生這個抽象類。那麼,我將如何覆蓋它是hello方法。 – 2015-02-24 06:06:12

+0

是你的班級公共?您將能夠只有當BaseClass的是公衆訪問組件外部該類@ ArunBisht – Mukund 2015-02-24 06:07:36

+0

命名空間ClassLibrary1的 { 公共抽象類的Class1 { 內部抽象無效秀()。 public abstract void hide(); } }我無法在程序集外部派生此類。給出錯誤...'ConsoleApplication1.Program'沒有實現繼承的抽象成員'ClassLibrary1.Class1.show()' – 2015-02-24 06:15:05

1

想象一下,你在你的項目中有一個代碼

可以說,它是一個控制檯應用程序,我們把它作爲ConsoleApplication1

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

      } 

      public abstract class MyAbsClass 
      { 
       public string DoSomething() 
       { 
       return DoSomethingInternal(); 

       } 

      internal abstract string DoSomethingInternal(); 

      public abstract string DoSomethingExternal(); 

      } 

      public class MyClass:MyAbsClass 
      { 
       internal override string DoSomethingInternal(){}     
       public override string DoSomethingExternal(){} 

      } 
     } 

,現在你已經(可以說另一consoleApp稱爲ConsoleApplication2)你建立你的consoleapplication1並添加引用它現在

using ConsoleApplication1; 

    namespace ConsoleApplication2 
    { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 
class NewClass : MyAbsClass 
{ 

    public override string DoSomethingExternal() 
    { 
     throw new NotImplementedException(); 
    } 
    } 
} 

當你建立這個你得到一個錯誤Error 1 'ConsoleApplication2.NewClass' does not implement inherited abstract member 'ConsoleApplication1.MyAbsClass.DoSomethingInternal()

爲什麼這個錯誤?因爲編譯器告訴你,當你聲明成員爲內部時,在同一個程序集中的類(即ConsoleApplication1)可以訪問它。所以無論您在ConsoleApplication2中創建了多少類,您都無法訪問它,因爲它被聲明爲內部

+0

是的,這就是@kyle。 – Mukund 2015-02-24 06:59:56

相關問題