0

OK .. C#は私の得意分野ではなく、この種のことに頭を悩ませてからしばらく経ちましたが、いくつかのことを忘れてしまいました。 doはC#内で可能であり、アブストラクトとインターフェイスはすべて地獄にあると確信しています(インターフェイスを配置する方法すらわかりませんが、必要なことはわかっています)

これがシナリオです

//abstract parent class
abstract class ActionType
{
    /***
     * this is a parent class not meant to ever be instaciated
     */
    public abstract void action();      
}

class ActionTypeSync : ActionType
{
    public override void action()
    {
        Debug.WriteLine("doing sync");
    }
}

class ActionTypeRead : ActionType
{
    public override void action()
    {
         Debug.WriteLine("doing read");
    }
}

以下は機能しません

ActionType action = getActionType(1);
ActionType secondaction = getActionType(2);

[ 編集 ]

実際、私は短すぎました。エラーで機能しなかったのはこのビットです。

エラー引数1:「ActionType」から「ActionTypeSync」に変換できません

processThings(action);
//debug out put "doing sync"    
processThings(secondaction);
//debug out put "doing sync"   

public ActionType getActionType(int i)
{
     if (i==1) return new ActionTypeSync();
     if (i==2) return new ActionTypeRead();
}

public void processThings(ActionTypeSync action)
{
     action.action();
}

public void processThings(ActionTypeRead action)
{
     action.action();  
}

[/ 編集 ]

これを再構築するためにどのように最善を尽くす必要がありますか..これは簡潔にするための例であることを理解してください(可能な限り)ここで要約しています-したがって、いくつかの原則はいくつかの「なぜなどの講義」よりも優れています:-)ありがとうあなた:-)私は多形原理に対応するために再構築することに反対しませんが、この基本的な多形インターフェース/クラス構造がそのまま必要です

4

1 に答える 1

2

構文エラーを見落として、これはあなたがそれをするように言ったことを正確にやっています。

インスタンス化した特定のタイプでローカルaction()を呼び出しています。指示していないため、他には何もしません(つまり、どの段階でも呼び出していませんbase.action())。

編集:

編集に基づいて....両方ActionTypeSyncActionTypeReadにキャストダウンできますActionTypeActionType、これらの派生タイプのいずれかにキャストバックすることはできません。派生オブジェクトの1つをとして渡すことができActionType、オーバーライドされたaction()メソッドが呼び出されますが、暗黙的または明示的に派生型にキャストすることはできません。これを修正するには、メソッドのシグネチャを変更するだけです。

public void processThings(ActionType action)
{
     action.action();
}

この変更により、基本タイプにキャストダウンしたため、両方の派生タイプを処理する1つのメソッドのみが必要になります。IOWを使用すると、processThings(ActionTypeRead action)メソッドを削除できます。

于 2012-11-21T22:13:36.827 に答える