2

次のコード:

class Program
{
    static P1 p = new P1();
    static void Main(string[] args)
    {
        var t = new P2();
        p = t;
        p.DoWork();
        t.DoWork();
        Console.ReadLine();
    }
}

public class P1
{
    public void DoWork()
    {
        Console.WriteLine("Test1");
    }
}
public class P2: P1
{
    new public void DoWork()
    {
        Console.WriteLine("Test2");
    }
}

印刷されます:

Test1
Test2

p.DoWork() の呼び出しを強制して P2 クラスの実装を使用する方法はありますか。実際には、クラス P1 はサード パーティがコンパイルしたアセンブリに含まれているため、P1 クラスのコードを変更することはできません。通常は virtual キーワードを P1 に追加するだけですが、これは不可能です。

4

3 に答える 3

3

いいえ。

の作成者は、メソッドを仮想化P1することを選択しませんでした。DoWorkしたがって、そのメソッドの動作を変更することはできません。

fromnewと同じ名前とシグネチャを持つメソッドを導入しないでください。混乱を招きます。また、オリジナルを変更することはありません。代わりに、独自のメソッドに新しい名前を付けてください。DoWorkP1DoWork

の機能P1が必ずしも必要なものではない場合は、から継承するべきではありませんP1。代わりに、あなたのクラスはタイプのプライベートフィールドを保持することがP1でき、あなたのいくつかのメソッドは の「良い」機能を使用することができますP1.

于 2013-07-28T09:47:46.617 に答える
1

次のように、P1 インスタンスを P2 にキャストできます。

((p2)p).DoWork();

または、P1 のインスタンスを内部的に使用するラッパー クラスを作成することもできます。内部クラスから必要なものはすべてリダイレクトされ、自分に合ったものを自由にラッパー クラスに追加できます。

public class P1
{
    public string SomeProperty { get; set; }

    public int SomeMethod()
    {
        return 0;
    }

    public void DoWork()
    {
        // Do something
    }
}

public class Wrapper
{
    private P1 Instance { get; set; }

    public string ExposedProperty
    {
        get
        {
            return this.Instance.SomeProperty;
        }
    }

    public Wrapper(P1 instance)
    {
        this.Instance = instance;
    }

    public int ExposedMethod()
    {
        return this.Instance.SomeMethod();
    }

    public void DoWork()
    {
        // Do something else
    }
}

このソリューションは、ファサード パターンhttp://en.wikipedia.org/wiki/Facade_patternに似ています。

于 2013-07-28T09:58:18.477 に答える
0

唯一の方法ですが、それは悪い方法です

class Program
{
    static P1 p = new P1();
    static void Main(string[] args)
    {
        var t = new P2();
        p = t;
        ((P2)p).DoWork();
        t.DoWork();
        Console.ReadLine();
    }
}
于 2013-07-28T09:32:53.050 に答える