调用继承对象的流畅方法时,如何使顺序无关紧要?
How can I make order irrelevant when calling fluent methods of inherited objects?
使用流畅的方法扩展 class 时,由于继承和 returned 对象的类型,调用流畅方法的顺序很重要。来自基础的流畅方法将 return 一个基本类型的对象,它不会有任何来自继承类型的流畅方法。但是反转方法调用就可以了。
例如:
public class Thing
{
public Thing DoThing()
{
return this;
}
}
public class ExtendedThing : Thing
{
public ExtendedThing DoExtendedThing()
{
return this;
}
}
// This works.
// DoExtendedThing returns an ExtendedThing object,
// which gets DoThing from Thing via inheritance
var extendedThing1 = new ExtendedThing().DoExtendedThing().DoThing();
// This doesn't work.
// DoThing returns a Thing object, which doesn't have
// DoExtendedThing on it
var extendedThing2 = new ExtendedThing().DoThing().DoExtendedThing()
我怎么可能让 DoThing
不是 return 一个 Thing
,而是 return 调用对象的任何类型的对象被扩展为 ,即使它在编译时不知道该类型是什么。
还是我只需要知道按 "correct" 顺序调用流畅的方法?
我相信这可以通过以下方式解决 pattern:
class Base<T> where T : Base<T>
{
public T Thing()
{
return (T)this;
}
}
class Derived : Base<Derived>
{
public void AnotherThing()
{
Console.WriteLine("Hello!");
}
}
对于var extended = new Derived().Thing();
行,extended
可以调用AnotherThing()
。
是您要找的吗?
更新:事实证明,如果已经回答 here
使用流畅的方法扩展 class 时,由于继承和 returned 对象的类型,调用流畅方法的顺序很重要。来自基础的流畅方法将 return 一个基本类型的对象,它不会有任何来自继承类型的流畅方法。但是反转方法调用就可以了。
例如:
public class Thing
{
public Thing DoThing()
{
return this;
}
}
public class ExtendedThing : Thing
{
public ExtendedThing DoExtendedThing()
{
return this;
}
}
// This works.
// DoExtendedThing returns an ExtendedThing object,
// which gets DoThing from Thing via inheritance
var extendedThing1 = new ExtendedThing().DoExtendedThing().DoThing();
// This doesn't work.
// DoThing returns a Thing object, which doesn't have
// DoExtendedThing on it
var extendedThing2 = new ExtendedThing().DoThing().DoExtendedThing()
我怎么可能让 DoThing
不是 return 一个 Thing
,而是 return 调用对象的任何类型的对象被扩展为 ,即使它在编译时不知道该类型是什么。
还是我只需要知道按 "correct" 顺序调用流畅的方法?
我相信这可以通过以下方式解决 pattern:
class Base<T> where T : Base<T>
{
public T Thing()
{
return (T)this;
}
}
class Derived : Base<Derived>
{
public void AnotherThing()
{
Console.WriteLine("Hello!");
}
}
对于var extended = new Derived().Thing();
行,extended
可以调用AnotherThing()
。
是您要找的吗?
更新:事实证明,如果已经回答 here