使用作为基类和继承类的参数类型进行重载

时间:2012-06-24 16:27:59

标签: c# inheritance overloading

我有这样的事情:

class BaseArg { }
class DerivedArg : BaseArg { }

interface IDoSomething
{
    void DoSomething();
}

class A : IDoSomething
{
    public BaseArg Value { get; set; }

    public A(BaseArg value)
    {
        this.Value = value;
    }

    public static A Create(BaseArg arg)
    {
        return new A(arg);
    }

    public static B Create(DerivedArg arg)
    {
        return new B(arg);
    }

    public virtual void DoSomething()
    {

    }
}

class B : A
{
    public DerivedArg DerivedValue { get; set; }

    public B(DerivedArg value)
        : base(value)
    {
        this.DerivedValue = value;
    }

    public override void DoSomething()
    {
        // does something different from A.DoSomething()
        // uses additional stuff in DerivedArg
    }
}

然而,即使我这样做:

DerivedArg arg = new DerivedArg();
A a = A.Create(arg);
调用

A.Create(BaseArg arg)(因此创建A,这不是意图)。

我在这里遗漏了什么吗?如果是这样,我应该如何在不使用诸如arg as DerivedArg上的条件之类的奇怪内容的情况下重写它。

1 个答案:

答案 0 :(得分:2)

正在执行正确的工厂方法。在以下内容中设置断点:

    public static B Create(DerivedArg arg)
    {
        return new B(arg); /* set breakpoint */
    }

在您 中显示,由于您已定义A类型的本地变量,因此未执行

A a = A.Create(arg);
正确调用

public static B Create(DerivedArg arg),并返回B类型的实例,并将其列为A类型。