2017-07-13 33 views
1

我必須使用一個庫,它有許多不同形狀的類。我必須使用它們來完成各種功能。Func和密封問題

例如,我有一個class Circle,它只公開一種方法`雙計算(Func)'。我閱讀了Func,Action,代表,但不知怎的,我並不完全確定。我試過:

var circle = new Circle(10); 
circle.Calculate(radius * 2 * 3.14); 

但它不起作用。 然後我試圖創建一個新類MyCircle和繼承圈來實現某些功能,但我得到了一個錯誤:

'MyCircle' cannot inherit from sealed class 'Circle'

我該怎麼辦?

+3

這將是'circle.Calculate(radius => radius * 2 * 3.14);' –

+0

看起來像一個奇怪的類。爲什麼不循環.Circumference作爲一個caclulated proerty或簡單'circum = circle.Radius * 2 * PI' – pm100

回答

1

也許類的定義是這樣的:

public sealed class Circle 
{ 
    private double radius; 

    public Circle(double r) 
    { 
     radius = r; 
    } 

    public double Calculate(Func<double, double> operation) 
    { 
     return operation(radius); 
    } 
} 

既然是sealed你不能繼承它。 另外,半徑是對象的私有字段,因此您無權訪問它。 這意味着您需要使用Calculate方法,方法是給它提供一個Func。如果你不知道Func是什麼,它是一個預定義的代表。類似於C中的函數指針,但類型安全。

這是你如何計算周長:

var circle = new Circle(10); 
circle.Calculate(r => 2 * Math.PI * r); 

你可以繼續前進,計算面積;)

1

Func<double,double>意味着一個函數,一張雙人牀和返回雙

所以你想要一個看起來像circle.Calculate(radius => radius * 2.0 * 3.14)

的lambda或者你可以有一個方法

double Circumference(double radius) 
{ 
    return radius * 2.0 * 3.14 
} 

然後

circle.Calculate(Circumference) 
1
double Calculate(Func<double, double>) 

根據這個簽名,該函數需要Func<double, double>。這是一個函數,它採用double類型的單個參數並返回double。因此,像下面:

double GetCircleCircumference(double radius) 
{ 
    return radius * 3.14 * 2; 
} 

然後,您可以通過該方法的功能:

circle.Calculate(GetCircleCircumference); 

你也可以通過在lambda函數這樣您就先定義一個方法:

circle.Calculate(radius => radius * 3.14 * 2); 

當然,這是否會產生任何有用的結果取決於什麼Calculate其實就是做。也許文檔會幫助你(我個人認爲「計算」是一種方法的可怕名稱 - 計算什麼?!)。

至於你,「‘MyCircle’無法從密封類‘圓圈’繼承」的錯誤信息,這意味着Circle被視爲密封類創建的,就像這樣:

public sealed class Circle 
{ 
    // … 
} 

這意味着那個階級的作者爲了繼承而放棄了「封鎖」。所以你不能從它繼承;你故意不能創建它的一個子類。如果你想擴大行爲,你將不得不用不同的方式來做到這一點,例如使用合成。