9

重複の可能性:
有効な例を使用して c# に隠蔽されているメソッド。フレームワークに実装されているのはなぜですか? 実世界の利点は何ですか。

メソッドの非表示が c# でどのように役立つのか疑問に思っています。概念に飛び込むと、メソッドの隠蔽が混乱を招き、スパゲッティ コード スタイルに駆り立てられることがわかりますこれにはいくつかの理由があり ます。

1- 派生クラスで新しいメソッドが必要な場合は、派生クラスで新しい名前の新しいメソッドを定義できます。

2-アップキャストを使用する場合、ポリモーフィックな方法で使用すると、期待される動作が実現されず、混乱を招く可能性があります。

(特に、基本クラスと派生クラスが異なるライブラリにあり、コードのどこかでそれらをポリモーフィックに使用したい場合、この奇妙な動作は非常に明白で明白になる可能性があります)

class Base
{  
    public void Method() { Console.WriteLine("I am Base Class"); }
}
class Derived: Base
{
    public new void Method() { Console.WriteLine("I am Derived Class");}
}
class Program
{
    static void Main(string[] args)
    {
        Base C = new Derived();
        C.Method(); //output:"I am Base Class"
    }
}

このような動作は混乱を招く可能性がありますが、「 Base 」で「 virtual」を使用し、「Derived 」で「override 」を使用した場合(ポリモーフィックな使用法を意味します)、出力は「I am Derived Class」でした。この出力は、私たちのほとんどが期待したものだと思います。

言い換えれば、階層では、ほとんどの開発者は、基本クラスの実装を隠したい派生クラス Not New メソッドのオーバーライドされたメソッドを期待していると思います。

C# 言語にメリットのない悪いことがなぜあるのか理解できませんか? 少なくとも、C# でメソッドを非表示にする最良の使用法を知りたいですか?

ご協力ありがとうございました

4

1 に答える 1

7

派生クラスで新しいメソッドが必要な場合は、派生クラスで新しい名前の新しいメソッドを定義できます

常にではない。制御できない他のライブラリで公開されているクラスを派生させる場合を考えてみましょう。クラスにいくつかのメソッドを追加します。

後で、依存するライブラリの開発者がいくつかの拡張機能を追加し、派生クラスに追加したメソッドの 1 つと同じ名前を使用します。この場合の非表示は、既存の機能を維持するだけです。メソッド名を変更すると、コード ベース全体を更新する必要があり、ライブラリを使用しているユーザーとの互換性が失われます。代わりに、既存のメソッドを非表示にして、依存するメソッドと依存するライブラリとの互換性を同時に維持できます。

個人的には、メソッドの隠蔽を最もよく使用するのは、複数のクラスでクローン操作を実装する場合です。この機能がなければ、戻り値の型をクラスの型と一致するように変更できませんでした。

class A
{
    public A Clone()
    {
        return CloneImpl();
    }

    protected virtual A CloneImpl()
    {
        return MemberwiseClone();
    }
}

class B : A
{
    new public B Clone()
    {
        return (B)CloneImpl();
    }
}

保護された仮想メソッドとは、どのメソッドClone()を呼び出しても、正しい型のオブジェクトが返されることを意味します。ただし、取得する参照のタイプは、呼び出しに使用した参照タイプによって異なりますClone()。これにより、次のことが可能になります。

B b = new B();
B b2 = b.Clone(); // Did not have to cast, thanks to the hiding method.

A a = b;
A a2 = a.Clone(); // Still returns a B, only typed as an A.
于 2013-01-22T15:15:22.467 に答える