在调用继承对象的流畅方法时,如何使顺序无关紧要?

时间:2017-07-12 15:14:40

标签: c# inheritance fluent

使用fluent方法扩展类时,由于继承和返回对象的类型,调用Fluent方法的顺序很重要。从基数开始的流畅方法将返回基类型的对象,该对象不会从继承类型中获得任何流畅的方法。但是反转方法调用,你很好。

例如:

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不返回Thing,而是返回的对象,调用对象已扩展到的任何类型,即使它会在编译时不知道那个类型是什么。

或者我只需要知道在"中更好地调用流畅的方法"购买?

1 个答案:

答案 0 :(得分:1)

我相信这可以通过以下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