0

練習のために、電卓プログラムを書こうとしています。難しくするために、私が学んだ高度な継承トピックのいくつかを使用しようとしましたが、実際には使用しませんでした。IMath1 つの methodという名前のインターフェイスがあるとしますstring DoMath()IMathそのインターフェースを実装するすべてのクラスが新しい値を見るように、変数をインターフェースに書き込むことは可能ですか? たとえば、私のクラスAdd : IMathにはメソッドがDoMath()あり、そのメソッドで IMath インターフェイスを実装するすべてのクラスが新しい値を参照するDoMath()変数の値を変更します。double ITotal

4

3 に答える 3

5

インターフェイスで変数またはフィールドを指定することはできません。次のもののみを指定できます。

  • メソッド
  • プロパティ
  • インデクサー
  • イベント

詳細については、インターフェイスに関する C# ドキュメントを参照してください。

インターフェイスは期待される動作を決定しますが、期待される実装は決定しません。プロパティは、「X の値を取得する機能」または「X の値を提供する機能」と読むことができ、変数は「X を格納する機能」です。これは同じことではなく、インターフェイスはそれを保証できません。

変数の存在を強制する必要がある場合は、基本クラスを使用する必要があります。おそらく、これらを組み合わせて、外部インターフェイスにインターフェイスを使用し(つまり、電卓機能をどのように機能させるか)、基本クラスと継承を使用して、同じコードを何度も書き直さないようにすることを検討します。

于 2013-03-28T11:06:11.807 に答える
1

あなたが探しているのは抽象基本クラスのようです。

あなたが説明したものの1つの可能な実装を以下に示します。

public abstract class MathBase
{
    public double Total { get; protected set; }

    public abstract string DoMath(double value);

    protected double ParseValue(string value)
    {
        double parsedValue;

        if (!double.TryParse(value, out parsedValue))
        {
            throw new ArgumentException(string.Format("The value '{0}' is not a number.", value), "value");
        }

        return parsedValue;
    }
}

public class Add : MathBase
{
    public override string DoMath(string value)
    {
        Total += ParseValue(value);

        return Convert.ToString(Total);
    }
}

を継承するすべてのクラスのすべてのインスタンスがMathBase同じ値を共有するようにするには、次のTotalように宣言しますstatic

public abstract class MathBase
{
    public static double Total { get; protected set; }

    public abstract string DoMath(string value);
}

(ただし、なぜこれが必要なのかはよくわかりません)

于 2013-03-28T11:03:36.243 に答える
0

次のようなことができます。

interface IMath
{
    string DoMath();
}

abstract class MathBase : IMath
{
    protected double Total { get; set; }

    public abstract string DoMath();
}

class Add : MathBase
{
    public override string DoMath()
    {
        this.Total = 2;

        return "2";
    }
}
于 2013-03-28T11:08:27.233 に答える