4

私のシステムにはいくつかのクラスがあります

//this was not made an Interface for some WCF reasons
public abstract class BaseTransmission
{
    protected internal abstract string Transmit();

    //other common properties go here
}

そして、次のようないくつかの子クラス

public class EmailTransmission : BaseTransmission
    {
        //This property is added separately by each child class
        public EmailMetadata Metadata { get; set; }

        protected internal override string Transmit()
        {
            //verify email address or throw
            if (!Metadata.VerifyMetadata())
            {
                throw new Exception();
            }
        }
    }

他の場所では、署名付きのメソッドを作成しましたTransmit(BaseTransmission transmission)。次のように、コードの別の部分からこのメソッドを呼び出しています。

TransService svc = new TransService();
EmailTransmission emailTrans = new EmailTransmission(); // this inherits from BaseTransmission
svc.Transmit(emailTrans);

これで私の目的は解決します。しかし通常、ポリモーフィズムの例を見ると、参照型が基本クラス型であり、子クラス型のインスタンスを指していることがわかります。通常、ポリモーフィズムの典型的な例では

EmailTransmission emailTrans = new EmailTransmission();

通常は

BaseTransmission emailTrans = new EmailTransmission();

EmailTransmission EmailMetadata は FaxMetadata とは異なるため、これを行うことはできません。そのため、BaseTranmission 型の参照を宣言し、EmailTranmission 型のインスタンスを指すようにすると、EmailTransmission の EmailMetadata プロパティにアクセスできなくなります。

私が上で行っていることがポリモーフィズムの誤用であるかどうか、それがポリモーフィズムを何らかの方法で「壊す」かどうかを知りたいです。そして、ポリモーフィズムを悪用している場合、これを行う正しい方法は何ですか。

4

5 に答える 5

1

これは完全に有効です。ポリモーフィック パターンはTransServiceサービスTransmitメソッドで使用されます。morphed1 つ以上のクラスに属することができるクラスで機能します。

基本クラスまたは派生クラスを使用して変数を宣言するという事実は、あなた次第であり、特定のケースによって異なります。

于 2013-09-27T14:57:40.873 に答える
0

通常、基本型を使用することをお勧めします

BaseTransmission emailTrans = new EmailTransmission();

これにより、抽象化がクリーンに保たれ、Don't Repeat Yourself に役立ちます。これは、次のシナリオで役立ちます。ユーザーが連絡方法 (電子メール、ファックス、テキスト) を選択できるとします。何かを送信する必要がある場合は、オブジェクトとパラメーターを受け取る単一のメソッド、たとえば.BaseTransmissionBaseParameter

注: 共有できるコードがあまりないように見える場合は、インターフェイスITransmitterを定義し、それを使用して、クラスが次のようなものを送信できることを示すことができます。

ITransmitter transmitter = new EmailTransmission();
于 2013-09-27T15:06:14.113 に答える
0

それは完全に問題ないはずです。transmit メソッド内では、オブジェクトは BaseTransmission として参照されるため、「ダウンキャスト」はあまり明白ではありません。(事前にコメントとしてこれを持っていましたが、これは本当に答えになるはずです)

于 2013-09-27T14:53:09.983 に答える
0

あなたがしていることは完全に正しく、問題なく動作するはずです。基本クラスを取る関数/メソッドに子クラスを渡すことは問題になりません。

ただし、ここでの例に関して:

これで私の目的は解決します。しかし通常、ポリモーフィズムの例を見ると、参照型が基本クラス型であり、子クラス型のインスタンスを指していることがわかります。通常、ポリモーフィズムの典型的な例では

EmailTransmission emailTrans = new EmailTransmission();

通常は

BaseTransmission emailTrans = new EmailTransmission();

これはBaseTransmission、 がインターフェイスまたは抽象クラスの場合に行われ、特定のバージョンの を作成する必要がありますBaseTransmission。追加のコンポーネントが必要ない場合、これを使用してコードをクリーンに保つことを好む人もいます。これの最も一般的な使用法は、たとえばを作成したいが、またはなどListの特定のバージョンの OS を実装する必要がある場合など、ジェネリックで見られます。ListArrayListLinkedList

于 2013-09-27T15:10:13.670 に答える
0

まあ、これは完全に有効なケースです TransService.Trasmit。メソッドで基本パラメーターのような基本クラス型を使用するためです。

奇妙に見える唯一のものは次のとおりです。

protected internal abstract string Transmit();

あなたは本当に必要ですか?はいの場合は、この概念をスキップしてください。protectedinternal

于 2013-09-27T14:53:36.690 に答える