Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用新关键字c强制使用方法_C# - Fatal编程技术网

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

C# 使用新关键字c强制使用方法,c#,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

以下代码:

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中,但这是不可能的。

这是唯一的方法,但这是一种不好的方法

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

这是唯一的办法,但这是一个坏办法

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

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

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

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

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

不要引入与P1中的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
    }
}

此解决方案类似于facade模式

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

这个解决方案将类似于门面模式

我不这么认为,看我不这么认为,看你是否会说这是一个糟糕的方式,你应该解释它的坏处。如果你说这是一个糟糕的方式,你应该解释它的坏处。