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

本文关键字:使用方法 关键字 | 更新日期: 2023-09-27 18:25:24

以下代码:

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中添加虚拟关键字,但这是不可能的。

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

否。

P1的作者没有选择将他们的DoWork方法虚拟化。所以你不能改变这种方法的作用。

不要引入与P1中的DoWork具有相同名称和签名的new方法。这将导致混乱。它不会以任何方式改变原来的DoWork。相反,为自己的方法选择一个新名称。

如果P1的功能在所有情况下都不是您所需要的,那么您可能根本不应该继承P1。相反,您的类可以持有P1类型的私有字段,然后您的一些方法可以使用P1的"良好"功能。

您可以将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

唯一的方法,但这是一种糟糕的方法

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();
    }
}