【问题标题】:Method chaining without parentheses, how to?没有括号的方法链接,如何?
【发布时间】:2013-12-13 02:39:27
【问题描述】:

我想做一个方法链,比如这样:

Car myCar = new Car();

// Chaining
myCar.config.engine.cylinders("4");

但是如何在不使用“config”或“engine”中的括号的情况下进行链接?

我只能想办法这样做:

myCar.config().engine().cylinders("4");

【问题讨论】:

  • 你试过属性吗? :)
  • 如果你想调用一个方法,你必须使用括号。如果你可以控制类,你可以定义 properties 而不是方法。
  • 我认为您混淆了方法和属性。在这种情况下,我会使用属性而不是方法。
  • @Ravi:扩展方法?您如何将它们伪装成财产?
  • @Ravi: 如何在没有括号的情况下调用扩展方法?

标签: c# class object methods chain


【解决方案1】:

您可以使用许多人建议的属性,但整个事情都违反了Law of Demeter(或最少知识原则)。基本上你正在打破 Car 类的封装。您可能想看看 Builder Pattern,尤其是流畅的实现(如 here)。

你的代码可能看起来像

Car myCar = new CarBuilder().WithEngineCylinders("4");

【讨论】:

    【解决方案2】:

    您可以通过在 Car 类中声明 Config 属性来做到这一点。然后CarConfig类中的Engine属性,像这样:

    public class Car
    {
        public CarConfig Config { get; set; }
    }
    

    然后你可以链接调用。

    【讨论】:

    • 具有只读 Config 属性但具有明确编写的 getter 的示例可能更适合这种特殊情况。
    • @O.R.Mapper:或者带有私人设置器的自动属性:public CarConfig Config { get; private set; }
    • “get”会自动返回 CarConfig 类的新实例吗? CarConfig 类应该有什么访问修饰符?谢谢。
    • 自动属性的语法等同于:private CarConfig _config; public CarConfig Config { get { return _carConfig; } set { _carConfig = value; } } CarConfig 类的访问修饰符的可见性应不低于 Car 类。例如。如果Car 类是公开的,CarConfig 也应该是公开的。如果Car 是内部的,则CarConfig 可以是公共的或内部的。实际上,这超出了当前问题的范围。
    • 但是“get”实际上是否创建了 CarConfig 类的“新”实例并将其返回给调用者?我想是的,因为如果你不实例化它就无法访问 CarConfig 的属性和方法?这是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多