0

5つのWebサービス(加算、マイナス、除算、乗算、比較)を使用するためにC#で記述された単純なクラスライブラリ(COM +サービス)があります。

抽象製品クラスと抽象ファクトリクラスを作成しました。WSのコードという名前の抽象的な製品:

public abstract class WS
{

    public abstract double Calculate(double a, double b);

    public abstract string Compare(double a, double b);
}  

ご覧のとおり、サブクラスの1つがWSを継承する場合、両方のメソッドをオーバーライドする必要があります。これは、一部のサブクラスでは役に立たない場合があります。たとえば、 CompareはCalculate()メソッドを必要としません。

新しいCompareWSオブジェクトをインスタンス化するために、クライアントクラスは、WSオブジェクトタイプを返すCreateWS()メソッドを呼び出します。

public class CompareWSFactory : WSFactory
{
    public override WS CreateWS()
    {
        return new CompareWS();
    }
}

ただし、Compare()がWSで定義されていない場合、Compare()メソッドを呼び出すことはできません。これは、クライアントがCompareWSオブジェクトではなくWSタイプのオブジェクトを使用するためです。

これは2つのメソッドの例にすぎませんが、さらにメソッドがある場合はどうなりますか?WSクラスですべてのメソッドを抽象として定義するのはばかげていますか?

私の質問は、WSのすべてのサブクラスに共通の抽象メソッドを定義したいのに対し、ファクトリがWSオブジェクトタイプを作成すると、サブクラスのすべてのメソッドを呼び出すことができます(WSのオーバーライドされたメソッドとサブクラスのメソッド)。これはどのようにすればよいですか?

4

3 に答える 3

0

WSクラスのすべてのサブクラスに共通するすべてのメソッドを宣言できますが、派生クラスで実装が変更されるメソッドのみを抽象として宣言する必要があります。Compareメソッドを抽象化することは意味がありません。なぜそのようなメソッドを呼び出すことができないと言うのですか?

Compare1つのクラスには常に抽象メソッドと非抽象メソッドを含めることができ、メソッドは抽象である必要はないように見えます。

于 2010-03-15T07:53:47.397 に答える
0

レジーナ、抽象クラスは抽象メソッドと仮想メソッドの両方を定義できます。仮想メソッドには、基本クラスにデフォルトの実装が含まれますが、必要に応じて派生クラスでオーバーライドできます。

    public abstract class WS
{

    // All derived classes will have to implement this
    public abstract double Calculate(double a, double b);

    // This can be overriden by derived classes (since it's a virtual method)
    public virtual string Compare(double a, double b)
    {
        // Some default implementation.
        // Any derived classes can override this implementation if they want
    }
}  
于 2010-03-15T07:57:44.403 に答える
0

クラスが抽象クラスを継承し、すべての抽象メソッドの本体を提供しない場合、そのクラスも抽象になります。この問題の1つの解決策は、クラスの代わりにインターフェイスを使用することです。

interface ICalculate
{
   double Calculate(double a, double b);
}
interface ICompare
{
   string Compare(double a, double b);
}
class Compare : ICompare
{
   public double ICompare.Compare(double a, double b) { .... }
}
class CompareAndCalculate : ICompare, ICalculate
{
   public string ICompare.Compare(double a, double b) { .... }
   public double ICalculate.Calculate(double a, double b) {...}
}
于 2010-03-15T07:59:55.760 に答える