使用新关键字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中添加虚拟关键字,但这是不可能的。
否。
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();
}
}