簡體   English   中英

抽象類不能用c#封裝?

[英]Abstract class cannot be sealed in c#?

我在某處讀到了

“抽象和密封修飾符相當於一個靜態的類”

我也發現了

“當你聲明一個靜態類時,編譯器在內部標記類抽象並密封,並在IL代碼中創建一個私有構造函數”

所以,我決定這樣做:

static class A
{
    public static void test()
    {
        Console.WriteLine("test");
    }
}

現在,類“A”不能被繼承或實例化。

因此,讓我們使用abstract編寫一個class B來防止實例化並使用sealed來防止繼承。

但是,這種方法失敗了。

這相當於

public abstract sealed class B
{
    private B()
    {

    }
    public void test()
    {
        Console.WriteLine("test");
    }
}

But I recieve an error stating "error CS0418: B':抽象類不能被密封或靜態”。 任何想法為什么這是不可能的?

提前感謝您的回答。

檢查了System.Directory類的IL(它是靜態的)后,它在IL中聲明為:

.class public auto ansi abstract sealed beforefieldinit System.IO.Directory
extends System.Object
{
    ...

此外,本文( http://msdn.microsoft.com/en-us/library/ms229038.aspx )建議CLR將靜態類作為抽象密封類處理,以支持不支持直接刪除靜態類的語言(例如C ++) )。

因此,總之,C#中的靜態類是具有私有構造函數的密封抽象類的語法糖。 我很高興,因為“靜態”更容易編寫,更容易正確。

根據定義,使用sealed類可以防止繼承先前標記為虛擬的類或某些類成員。

Abstract關鍵字使您可以創建不完整的類和類成員,並且必須在派生類中實現。 (來源: http//msdn.microsoft.com/en-us/library/ms173150.aspx

這意味着任何標記為摘要的類都不能被密封,因為你無法在任何地方獲得它。

你提到的代碼沒有任何意義。

所有答案都以某種方式采用技術觀點。 如:類不能同時“必須繼承”和“不能繼承”。 但我認為這不是主要原因,顯然,“靜態”就是這樣。 我認為David Amo的回答有點觸及了真正的答案,他說:“要做得更好更容易”。

我確信Anders Hejlsberg在設計C#時的想法是消除歧義,從而減少出錯的機會。 這就是“虛擬”與“覆蓋”相關的原因(覆蓋必須是顯式的,而不是像Java中那樣隱式)。 在這種情況下,“抽象”+“密封”將與“靜態”相同。 兩種定義相同原理的方法。 這是: - 更容易出錯(假設你有一個抽象的東西並且意外地密封在那里而沒有注意到,onw編譯器阻止了這一點) - 更難以使用(想象你想在項目中搜索所有靜態類)

所以我的觀點是,整個設計引導開發人員正確的做事方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM