Не поймите меня неправильно: я не хочу заставлять переопределяющий метод вызывать базовый класс, как уже просили 1000... раз раньше :)
Я задавался вопросом, есть ли способ принудительно вызвать реализацию метода базового класса внутри базового класса.
Пример:
using System;
public class Program
{
public static void Main()
{
var c = new SubClass();
c.CallInfo();
}
internal class BaseClass {
protected virtual void Info(){
Console.WriteLine("BaseClass");
}
internal virtual void CallInfo() {
this.Info();
}
}
internal class SubClass : BaseClass {
protected override void Info() {
Console.WriteLine("SubClass");
}
internal override void CallInfo() {
base.CallInfo();
}
}
}
Выход, очевидно, будет SubClass
. Есть ли способ заставить CallInfo
метод BaseClass
назвать свои собственные Info
методы, так что выход будет BaseClass
?
Помечая ваш метод Info()
как virtual
вы специально запрашиваете такой тип наследования.
Если вы хотите убедиться, что вызов метода в вашем базовом классе не переопределен, вам нужно использовать не виртуальный метод, например
internal class BaseClass {
protected virtual void Info(){
this.FinalInfo();
}
protected void FinalInfo() {
Console.WriteLine("BaseClass");
}
internal virtual void CallInfo() {
this.FinalInfo();
}
}
Нет, ты не можешь этого сделать. Назначение виртуальных методов состоит в том, что производные классы могут переопределять реализацию и что реализация используется даже при вызове ее из базовых классов.
Если это вызывает проблемы, то метод, который вы хотите запустить, не должен быть виртуальным.
Это сработает, хотя и не будет принудительно реализовывать реализацию подклассом вроде виртуального, оно позволит вам переопределить его.
public class Program
{
public static void Main()
{
var c = new SubClass();
c.CallInfo();
}
internal class BaseClass
{
protected void Info()
{
Console.WriteLine("BaseClass");
}
internal virtual void CallInfo()
{
this.Info();
}
}
internal class SubClass : BaseClass
{
protected new void Info()
{
Console.WriteLine("SubClass");
}
internal override void CallInfo()
{
base.CallInfo();
}
}
}