メソッドを宣言するabstract
と自動的に仮想化されるというのは正しいですか?
つまり、サブクラスでは何度もオーバーライドでき、実行時に、オブジェクトの実行時タイプに対応するメソッドが呼び出されますか?
抽象非仮想メソッドを宣言することは可能ですか?つまり、非抽象サブクラスで実装する必要があり、オーバーライドできないメソッドですか?
メソッドを宣言するabstract
と自動的に仮想化されるというのは正しいですか?
つまり、サブクラスでは何度もオーバーライドでき、実行時に、オブジェクトの実行時タイプに対応するメソッドが呼び出されますか?
抽象非仮想メソッドを宣言することは可能ですか?つまり、非抽象サブクラスで実装する必要があり、オーバーライドできないメソッドですか?
はい、抽象メソッドは定義上仮想です。サブクラスによって実際にオーバーライドされるためには、それらはオーバーライド可能でなければなりません。
インスタンスメソッド宣言に
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
抽象メソッドは(暗黙的に)仮想ですが、具象基本クラスの実装は(キーワードのために)非仮想であることに注意してください。
はい、それらは仮想です。そうしないと、それらの実装を作成する方法がありません。