-2

この質問のタイトルが問題を正確に要約していることを願っています。詳細は次のとおりです。

MyFirstClassとMySecondClassという、いくつかのプロパティと関連するメソッドを共有する2つのクラスがあります。したがって、この交差するプロパティのセットを、両方のクラスが継承する抽象クラスMyAbstractBaseClassに配置します。

ここまでは順調ですね。ただし、コードの他の場所のメソッドでは、これらの共有プロパティを操作しており、MyFirstClassとMySecondClassの両方のインスタンスを参照によってこのメソッドに渡せるようにしたいと考えています。何かのようなもの:

result1 = myMethod(ref MyFirstClass);
result2 = myMethod(ref MySecondClass);

メソッドのパラメータータイプとしてMyAbstractBaseClassを使用してみました。

public bool myMethod(ref MyAbstractBaseClass anObject)

しかし、これはコンパイラーによって受け入れられません。また、MyAbstractBaseClassからインターフェイスを抽出し、MyFirstClassとMySecondClassの両方にMyAbstractBaseClassを継承させて、次のようにインターフェイスを実装しようとしました。

public class MyFirstClass : MyAbstractBaseClass, IMyAbstractBaseClass 
public class MySecondClass : MyAbstractBaseClass, IMyAbstractBaseClass 

次に、タイプIMyAbstractBaseClassのインターフェイスのパラメーターを作成すると、myMethodが両方のクラスで動作できることを期待していました(結局のところ、OOPでは、可能な場合はインターフェイスに対してコーディングすることになっています)。

public bool myMethod(ref IMyAbstractBaseClass anObject)

IMyAbstractBaseClass myObject = new MyFirstClass();
result1 = myMethod(ref myObject);

これも機能していません。コンパイラは、MyFirstClassをIMyAbstractBaseClassに変換することはできないと言っていますが、これは奇妙に思えます。MyFirstClassはインターフェイスを実装しているため、このクラスのすべてのオブジェクトをインターフェイス型として扱うことができるはずです。

ここで何が欠けていますか?

4

2 に答える 2

1

パラメータは本当にrefによって渡される必要がありますか?

それらが参照型(つまりクラス)であり(そしてそれらがそうである)、それらにプロパティを設定するだけの場合、それらは参照によって渡される必要はありません。(refereneによる参照の受け渡しは、ポインターへのポインターを持つことです)

オブジェクト全体を置き換える場合にのみ、次の参照が必要です。

public bool myMethod(ref IMyAbstractBaseClass anObject)
{
      myObject = new MyFirstClass();
      return true;
}

public bool myMethod2(MyAbstractBaseClass anObject)
{
      myObject.SomeProperty = 5;
      return true;
}

IMyAbstractBaseClass myObject = new MyFirstClass();
result1 = myMethod(ref myObject);
result1 = myMethod2(myObject);

myMethod2()は、希望どおりに機能します。

于 2013-01-23T19:36:34.857 に答える
1

なんらかの奇妙な理由でメソッドパラメータを別のオブジェクトに割り当てる必要がある場合を除いて、参照によってパラメータを渡さないでください。これは通常、移動する方法ではありません。「Ref」パラメータは抽象クラスをサポートしていません。

C#はC++ではありません。キーワードなしでオブジェクト全体のコピーを作成することはありません。refオブジェクトへの参照(基本的にはポインタ)のコピーをメソッドに渡します。

于 2013-01-23T19:37:12.773 に答える