10

メソッドを宣言するabstractと自動的に仮想化されるというのは正しいですか?

つまり、サブクラスでは何度もオーバーライドでき、実行時に、オブジェクトの実行時タイプに対応するメソッドが呼び出されますか?

抽象非仮想メソッドを宣言することは可能ですか?つまり、非抽象サブクラスで実装する必要があり、オーバーライドできないメソッドですか?

4

2 に答える 2

12

はい、抽象メソッドは定義上仮想です。サブクラスによって実際にオーバーライドされるためには、それらはオーバーライド可能でなければなりません。

インスタンスメソッド宣言にabstract修飾子が含まれている場合、そのメソッドは抽象メソッドと呼ばれます。抽象メソッドは暗黙的に仮想メソッドでもありますが、修飾子を持つことはできませんvirtual

逆に、抽象非仮想メソッドを宣言することはできません。宣言できる場合は、実装できず、したがって呼び出すことができないメソッドがあり、かなり役に立たないためです。

ただし、クラスに抽象メソッドを実装させたいが、そのサブクラスのいずれにもその実装を変更させたくない場合は、それが役立ちsealedます。例:

abstract public class AbstractClass
{
    abstract public void DoSomething();
}

public class BaseClass : AbstractClass
{
    public sealed override void DoSomething()
    {
        Console.WriteLine("Did something");
    }
}

sealed抽象メソッドは(暗黙的に)仮想ですが、具象基本クラスの実装は(キーワードのために)非仮想であることに注意してください。

于 2012-06-10T14:47:23.620 に答える
2

はい、それらは仮想です。そうしないと、それらの実装を作成する方法がありません。

于 2012-06-10T14:48:20.820 に答える