0

ClassB型のパラメータをとる抽象メソッドを持つ抽象クラスClassAがあります。いくつかのクラスがそれから派生しています。次に、同様の機能を備えているが、いくつかのクラスを派生させるためにわずかに異なる基本ClassAを必要とする別のプロジェクトを追加します。主な違い:新しい基本クラスであるClassCは、引数としてClassBを使用するべきではありませんが、Bから派生した別のクラスであるClassDを使用する必要があります。その後、ClassCをいくつかのクラスでベースとして再度使用する必要があります。

これは可能ですか?これは、好奇心からの質問です。これを行うことで、ジェネリックで可能であることを私は知っています:

public abstract void Method1<T>(T parameter) where T : ClassB;
...
public override void Method1<ClassB>(ClassB parameter) {

ジェネリックなしでそれは可能ですか?そして、タイプを2回入力する必要があることを除けば、彼らには何か問題がありますか?

abstract class ClassA
{
    public abstract void Method1(ClassB parameter);
}

class DerivingClasses1 : ClassA
{
    public override void Method1(ClassB parameter)
    {
        // do something
    }
}

// -------

abstract class ClassC : ClassA
{
    // This would have to override Method1 of ClassA somehow,
    // instead of overloading it.
    public abstract void Method1(ClassD parameter);
}

class DerivingClasses2 : ClassA
{
    public override void Method1(ClassD parameter)
    {
        // do something
    }
}

// -------

class ClassB
{
}

class ClassD : ClassB
{
}
4

3 に答える 3

4

私の意見では、最良のアプローチは、新しいパラメーター型でオーバーロードを呼び出す封印された実装で基本クラスのメソッドをオーバーライドし、それによってユーザーを型変換から隔離することです。

abstract class ClassC : ClassA
{
    public override sealed void Method1(ClassB parameter)
    {
        this.Method1(parameter as ClassD);
    }

    public abstract void Method1(ClassD parameter);
}

編集:本番環境で使用する場合は、予期しないnullが発生しないように、適切な型チェックを実行する必要があります。

abstract class ClassC : ClassA
{
    public override sealed void Method1(ClassB parameter)
    {
        if (!(parameter is ClassD))
            throw new ArgumentException(
                "Parameter must be of type ClassD.", "parameter");

        this.Method1((ClassD)parameter);
    }

    public abstract void Method1(ClassD parameter);
}
于 2012-05-02T18:59:43.067 に答える
0

異なるパラメーターを持つ別のメソッドで抽象メソッドをオーバーライドします

これは実際には不可能ですが、共通のインターフェースを使用できます。

interface IMyType {}

class MyTypeBase 
{
  public abstract void Method1(IMyType parameter); 
}
于 2012-05-02T18:57:26.427 に答える
0

ClassCに両方の方法を実装するだけです。

于 2012-05-02T18:58:06.343 に答える