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
}
}
这个解决方案将类似于门面模式我不这么认为,看我不这么认为,看你是否会说这是一个糟糕的方式,你应该解释它的坏处。如果你说这是一个糟糕的方式,你应该解释它的坏处。