2016-08-02 21 views
0

这是工厂模式,其中一个属性用于通过Create获得一个实例:用行动而不是Func键

public class Dialer 
{ 
    public static Func<Dialer> Create; 
    public bool MakeCall(string number) ... 
    public Dialer(IDialer impl) { ... } 
} 

然后lambda表达式分配给财产委托于特定平台项目与

Dialer.Create =() => new Dialer(new PhoneDialeriOS()); 

,并获得一个实例中与平台无关的项目,我用

this.dialer = Dialer.Create(); 

现在我希望使用

public static Action<Dialer> Create; 

如果我得到这个权利,分配现在是

Dialer.Create = (d) => new Dialer(new PhoneDialeriOS()); 

但我如何得到一个实例?

this.dialer = // ? 

通过使用this.dialer = Dialer.Create();我得到

错误CS7036没有给定参数对应于“OBJ”的“操作”

但它并不需要的形式参数在这里传递PhoneDialeriOS的实例是有意义的,因为在平台无关的代码中没有对它的访问。我认为我所关注的例子是误导性的,或者我错过了一些东西。

回答

4

Action<Dialer>收到 a Dialer实例的代表,并返回void。毕竟,这是一个Action。如果你想让它返回一个值(并得到一个参数),你需要使用Func<Dialer, Dialer>来代替。

+0

就是这样。该示例讲述了“公共静态操作 Create;',但这是不可能的,因为我无法传递该实例。 Imho的例子是错误的。 '公共静态行动创建;'是唯一正确的方法。 – testing

+0

'公共静态行动 Create'仍然是一个不返回任何内容的委托。我不确定你怎么可以考虑一个不能生产任何东西的工厂是“唯一正确的方法”。 – Joey

+0

你说得对。我做了一个复制和粘贴错误。 '公共静态函数创建;'是唯一正确的方法。 – testing

1

下可能是可能的用法

var specific_dialer = new Dialer(new PhoneDialeriOS()); 
var defualt_dialer = Dialer.Create(); 

编辑

当然,你可以不喜欢

Dialer.Create =() => new Dialer(new PhoneDialerAndroid()); 

东西没有(有可能是错误的复制/粘贴)与线行动

+0

啊,我明白了。问题在于对特定拨号程序的访问非常有限(仅限特定于平台的项目)。 – testing

相关问题