Ваше определение неверно. В C # это не основано только на том, является ли метод виртуальным. Даже виртуальные методы могут вести себя по-разному в зависимости от типа ссылки. Посмотрите пример ниже и посмотрите на ключевое слово new .
Язык Java прост. Он пытается оставаться простым. Да, это отнимает «некоторую власть», как вы написали, но в качестве компенсации вы получаете чистый код, который легко понять.
Язык C # имеет больше возможностей, но иногда вам нужно изо всех сил пытаться понять все из них. Этот конкретный пример наследования методов с одинаковыми именами является хорошим примером. Мы можем создавать более интересные вещи в C # .... которые никто не поймет.
Обычно мы не можем выбирать язык, поскольку мы ограничены системной платформой, библиотеками и другими технологиями.
class A {
public virtual void M1() {
Console.WriteLine("A.M1()");
}
}
class B : A {
public new virtual void M1() {
Console.WriteLine("B.M1()");
}
}
class Program {
static void Main(string[] args) {
B b = new B();
b.M1();
A a = b;
a.M1();
}
}
В C # вы получаете два разных результата, хотя у вас один и тот же объект.