C# C工厂模式基方法将始终被调用

C# C工厂模式基方法将始终被调用,c#,design-patterns,C#,Design Patterns,我想知道为什么在下面的示例中,当Factory Pattern Builder返回一个对象的新实例时,即使我重写了base方法,也总是调用它 interface FactoryInter { void MakeDetails(); } class Builder { public static Builder getObject(string obj) { if(obj == "Cont") { return

我想知道为什么在下面的示例中,当Factory Pattern Builder返回一个对象的新实例时,即使我重写了base方法,也总是调用它

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
    }
}

任何帮助都将不胜感激

请不要忽略它。你把它藏起来了。方法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");
    }
}
现在对它们进行测试可以得到以下结果:

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

若要覆盖它,请将基本方法标记为虚拟方法,将派生方法标记为覆盖方法。

提示:始终阅读警告。请参阅Skleanthu的重点。可以找到更详细的解释