以下代码:
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,但这是不可能的。
答案 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();
}
}