Pho*_*rce -1 c# design-patterns
我想知道为什么在下面的例子中,即使我在工厂模式"Builder"返回对象的新实例时覆盖它,总是会调用基本方法?
interface FactoryInter
{
void MakeDetails();
}
class Builder {
public static Builder getObject(string obj)
{
if(obj == "Cont")
{
return new Cont();
}else{
return new Builder();
}
}
public void MakeDetails()
{
Console.WriteLine("I will always get called..");
}
}
class Cont : Builder, FactoryInter {
public void MakeDetails()
{
Console.WriteLine("Hello..");
}
}
public class Test
{
public static void Main()
{
Builder b = new Builder();
b = Builder.getObject("Cont");
b.MakeDetails();
// your code goes here
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
你不要覆盖它.你在隐藏它.方法Cont.MakeDetails()隐藏基类的MakeDetails方法.有关详细信息,请参阅以下示例:
class Base
{
public void Hidden()
{
Console.WriteLine("Base!");
}
public virtual void Overrideable()
{
Console.WriteLine("Overridable BASE.");
}
}
class Derived : Base
{
public void Hidden()
{
Console.WriteLine("Derived");
}
public override void Overrideable()
{
Console.WriteLine("Overrideable DERIVED");
}
}
Run Code Online (Sandbox Code Playgroud)
现在测试它们会产生以下结果:
var bas = new Base();
var der = new Derived();
bas.Hidden(); //This outputs Base!
der.Hidden(); //This outputs Derived
((Base)der).Hidden();
//The above outputs Base! because you are essentially referencing the hidden method!
//Both the below output Overrideable DERIVED
der.Overrideable();
((Base)der).Overrideable();
Run Code Online (Sandbox Code Playgroud)
要覆盖它,请将基本方法标记为虚拟,将派生方法标记为覆盖.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |