5
public abstract class A
{
    public abstract void Process();
}

public abstract class B : A
{
    public abstract override void Process();
}

public class C : B
{
    public override void Process()
    {
        Console.WriteLine("abc");
    }
}

このコードはコンパイルエラーをスローします:「B」は継承された抽象メンバー「A.Process()」を実装していません。

これを行う方法はありますか?

4

4 に答える 4

13

クラスBのメソッドを完全に除外するだけです。BはとにかくAからメソッドを継承します。また、B自体は抽象的であるため、明示的に再度実装する必要はありません。

于 2009-11-20T08:08:30.770 に答える
8

VS2008で動作します。エラーも警告もありません。ただし、Bに「オーバーライド」を含める理由はありません。このコードは同等です。

public abstract class A
{
    public abstract void Process();
}

public abstract class B : A
{
}

public class C : B
{
    public override void Process()
    {
        Console.WriteLine("abc");
    }
}
于 2009-11-20T08:10:38.613 に答える
3

アロン -

これは意味がありません。まず第一に、これは実際にうまくコンパイルされます。次に、A で宣言した抽象メソッドが B に継承されます (まだ抽象的です)。したがって、クラス B で Process() を宣言する必要はありません。

- マーク

于 2009-11-20T08:17:54.607 に答える
3

私がこれを時々見た場所は、抽象メソッドで非抽象仮想メソッドをオーバーライドすることです。例えば:

public abstract class SomeBaseType
{
    /* Override the ToString method inherited from Object with an abstract
     * method. Non-abstract types derived from SomeBaseType will have to provide
     * their own implementation of ToString() to override Object.ToString().
     */
    public abstract override string ToString();
}

public class SomeType : SomeBaseType
{
    public override string ToString()
    {
        return "This type *must* implement an override of ToString()";
    }
}
于 2009-11-20T08:36:13.910 に答える