6

どこかで読んだ

「Abstract および Sealed 修飾子は、静的なクラスと同等です」

私もそれを見つけました

「静的クラスを宣言すると、コンパイラは内部的にクラスを抽象化してシールをマークし、IL コードにプライベート コンストラクターを作成します」

だから、私はこれを行うことにしました:

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

現在、クラス「A」は継承もインスタンス化もできません。

そこで、インスタンス化を防ぐためにclass Busingを書き、継承を防ぐために using を書きましょう。abstractsealed

しかし、このアプローチは失敗します。

これはと同等でなければなりません

public abstract sealed class B
{
    private B()
    {

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

But I recieve an error stating "error CS0418:B': 抽象クラスをシールまたは静的にすることはできません"` .これが不可能な理由はありますか?

ご回答ありがとうございます。

4

3 に答える 3

3

定義により、sealedクラスを使用すると、以前に仮想としてマークされたクラスまたは特定のクラス メンバーの継承を防ぐことができます。

Abstractキーワードを使用すると、不完全で派生クラスに実装する必要があるクラスおよびクラス メンバーを作成できます。(出典: http://msdn.microsoft.com/en-us/library/ms173150.aspx )

これは、abstract とマークされたクラスはどこにも派生できないため、シールできないことを意味します。

あなたが言及したコードは意味がありません。

于 2013-10-16T13:23:50.367 に答える
1

すべての回答は、どういうわけか技術的な観点からのものです。例: クラスは同時に「継承する必要がある」と「継承できない」にすることはできません。しかし、それが主な理由ではないと思います。明らかに、「静的」はまさにそれです。David Amo の答えは、「正しく行う方がずっと簡単だ」と述べて、実際の答えに少し触れていると思います。

C# を設計する際の Anders Hejlsberg のアイデアは、あいまいさを排除し、エラーの可能性を減らすことであったと確信しています。これが、「仮想」が「オーバーライド」と一緒に使用される理由です (オーバーライドは、Java のように暗黙的ではなく、明示的でなければなりません)。この場合、「abstract」+「sealed」は「static」と同じになります。同じ原則を定義する 2 つの方法。これは次のとおりです: - エラーが発生しやすくなります (どこかにabstractがあり、気づかずに誤ってそこに封印されていると想像してください。onwコンパイラーはそれを防ぎます) - 操作がより困難です (プロジェクト内のすべての静的クラスを検索したいと想像してください)。

つまり、この設計全体が開発者を正しいやり方に導くということです。

于 2016-09-12T08:34:23.440 に答える