2016-08-02 56 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

相關問題