我在基类中有一个方法,它应该返回类型的自我实例作为派生类型。例如:
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
的方法。我该如何设计这样的功能?
答案 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");