使用新关键字c#强制使用方法

时间:2013-07-28 09:27:02

标签: c#

以下代码:

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类的任何代码。通常我只是将虚拟关键字添加到P1,但这是不可能的。

3 个答案:

答案 0 :(得分:3)

没有

P1的作者没有选择将DoWork方法设为虚拟。所以你无法改变那种方法的作用。

请勿在{{1​​}}中引入与new具有相同名称和签名的DoWork方法。这会导致混乱。并且它不会以任何方式更改原始P1。而是为您自己的方法选择一个新名称。

如果DoWork的功能并非在所有情况下都不需要,那么您可能根本不应继承P1。相反,您的类可以包含P1类型的私有字段,然后您的某些方法可以使用P1的“良好”功能。

答案 1 :(得分: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

答案 2 :(得分: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();
    }
}