抽象類中內部抽象方法的用途是什麼? 爲什麼要在抽象類中創建抽象方法?如果我們想限制抽象類在組件外面,爲什麼不抽象抽象的內部類。 它背後是否還有其他邏輯。抽象類中的內部抽象方法的目的是什麼?
回答
添加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
方法。
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#中的訪問修飾符概念。
感謝Mukund,但是在做了一個內部的抽象方法之後,我無法在程序集外派生這個抽象類。那麼,我將如何覆蓋它是hello方法。 – 2015-02-24 06:06:12
是你的班級公共?您將能夠只有當BaseClass的是公衆訪問組件外部該類@ ArunBisht – Mukund 2015-02-24 06:07:36
命名空間ClassLibrary1的 { 公共抽象類的Class1 { 內部抽象無效秀()。 public abstract void hide(); } }我無法在程序集外部派生此類。給出錯誤...'ConsoleApplication1.Program'沒有實現繼承的抽象成員'ClassLibrary1.Class1.show()' – 2015-02-24 06:15:05
想象一下,你在你的項目中有一個代碼
可以說,它是一個控制檯應用程序,我們把它作爲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中創建了多少類,您都無法訪問它,因爲它被聲明爲內部。
是的,這就是@kyle。 – Mukund 2015-02-24 06:59:56
- 1. 抽象方法的目的是什麼?
- 2. 允許在非抽象類中聲明抽象方法的目的是什麼?
- 3. 爲什麼你需要知道抽象類的抽象方法是否抽象
- 4. 抽象類中的方法的外部抽象和局部抽象之間有什麼區別?
- 5. 什麼是抽象類和抽象方法?
- 6. 什麼非抽象空洞的方法,抽象類
- 7. 如果無法創建抽象類的新對象,抽象類中的非抽象方法有什麼意義?
- 8. C#:抽象類中的抽象和非抽象方法?
- 9. 類中的抽象方法
- 10. 爲什麼使用方法局部抽象內部類
- 11. 抽象類(C#)中的部分方法
- 12. 建議從抽象類中的方法調用抽象方法
- 13. 抽象類抽象方法的部分實現
- 14. 什麼是抽象類型?
- 15. 什麼是在PHP中的抽象類?
- 16. 抽象類非抽象方法調用
- 17. 抽象類和抽象方法
- 18. 抽象類沒有抽象方法
- 19. 具有抽象類參數的抽象方法的Java抽象類
- 20. 抽象類中main方法的用法是什麼?
- 21. 錯誤:類不是抽象的,不重寫抽象方法
- 22. 如何使用Moq模擬包含內部抽象方法的抽象類?
- 23. 使用抽象類中抽象類的引用抽象類c
- 24. 抽象類中的動態抽象類
- 25. 抽象方法重寫抽象方法
- 26. 爲什麼HttpServletRequestWrapper類不是抽象的
- 27. 爲什麼返回類型的方法是抽象的?
- 28. 從抽象類中的回調調用抽象方法
- 29. 類不抽象,也不重寫java.util.timertask中的抽象方法run()
- 30. 非抽象類不能覆蓋Comparable中的抽象方法compareTo?
感謝Marcin的回覆,但是你能否解釋一下你的這些行......但是類聲明程序集之外,類本身以及所有派生類仍然可以使用(因爲類型是公共的)。 – 2015-02-24 05:53:23