2017-07-13 6 views
1

私はさまざまな形の多くのクラスを持つライブラリを使用する必要があります。私はそれらを使用してさまざまな機能を実行する必要があります。ファンクと封印の問題

例えば、私はclass Circleを持っています。このメソッドは `double Calculate(Func) 'という1つのメソッドしか公開していません。私は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

は奇数クラスのようです。なぜ円にならないのですか?円は円錐形の草地、または単純に円周=円.Radius * 2 * PI – pm100

答えて

1

おそらくクラスはこのような何かに定義されています。それはあなたがそれを継承することはできませんsealedあるので

public sealed class Circle 
{ 
    private double radius; 

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

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

を。 また、半径はオブジェクトのプライベートフィールドなので、アクセスできません。 これはを指定してCalculateメソッドを使用する必要があることを意味します。 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)

のようなラムダが必要な場合、または方法が

の場合
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); 

あなたはまた、最初にそのメソッドを定義する必要がなくなりますラムダ関数に渡すことができます。

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

もちろん、これが有用な結果をもたらすかどうかは、実際には何をしているのかによって異なります。Calculateドキュメンテーションが役立つかもしれません(私は個人的に、「計算」はメソッドのひどい名前だと思っています - 何を計算しますか?)。あなたが得るエラーメッセージ、については

「『MyCircleは』シールクラス 『サークル』から継承することはできない」、これはCircleはそうのように、密閉されたクラスとして作成されたことを意味します

public sealed class Circle 
{ 
    // … 
} 

このそのクラスの作者が継承のために "それを封鎖する"という言い分を持っていたことを意味します。だからあなたはそれを継承することはできません。意図的にそのサブクラスを作ることはできません。ビヘイビアを拡張したい場合は、コンポジションを使用するなど、別の方法で行う必要があります。

関連する問題