如何从基类型声明的方法返回派生类型

时间:2013-04-21 02:08:29

标签: c# .net fluent derived-class

我在基类中有一个方法,它应该返回类型的自我实例作为派生类型。例如:

class A
{
   public string X { get; set; }

   public A SetX(string x)
   {
       this.X = x;
       return this;
   }
}

class B:A
{
   public string Y { get; set; }

   public B SetY(string y)
   {
       this.Y = y;
       return this;
   }
}

然后我想流利地调用方法如下:

B b = new B();

b.SetX("x")
 .SetY("y");

但是这里SetX返回A的类型,A没有任何名为SetY的方法。我该如何设计这样的功能?

4 个答案:

答案 0 :(得分:4)

一种选择是将SetX声明为通用扩展方法:

public static T SetX<T>(this T a, string x) where T : A
{
    a.X = x;
    return a;
}

然后你可以这样称呼它:

var newB = b.SetX("foo"); // returns type B

答案 1 :(得分:3)

你可以做很多不同的事情来实现这个目标。

第一种是使用泛型,使用类型参数来指定实例的真实类型:

public class A<T> where T:A<T>
{
    public string X { get; private set; }

    public T SetX(string x)
    {
        X = x;
        return (T) this;
    }
}

public class B<T> : A<T>
    where T : B<T>
{
    public string Y { get; private set; }

    public T SetY(string y)
    {
        Y = y;
        return (T) this;
    }
}

public class A : A<A>
{
}

public class B : B<B>
{
}

第二个是,在B课程中,使用A关键字隐藏new方法,如下所示:

class A
{
    public string X { get; set; }

    public A SetX(string x)
    {
        this.X = x;
        return this;
    }
}

class B : A
{
    public string Y { get; set; }

    public new B SetX(string x)
    {
        return (B) base.SetX(x);
    }

    public B SetY(string y)
    {
        this.Y = y;
        return this;
    }
}

答案 2 :(得分:0)

使用protected:

protected string X { get; set; }
protected A SetX(string x)
{
   this.X = x;
   return this;
}

答案 3 :(得分:0)

这个对我有用:

(b.SetX("1") as B).SetY("2");