В настоящее время я изучаю C# самостоятельно после изучения Java в течение всего семестра.
Одной из особенностей Java (или объектно-ориентированного программирования в целом) является возможность переопределения методов, которые унаследованы в подклассе.
Когда я изучал эту функцию в C#, я пытался самостоятельно переопределить метод, не изучая, как правильно переопределять методы в C#, и, похоже, это сработало.
Однако при дальнейшем изучении я узнал, что нам нужно использовать ключевое слово virtual при объявлении метода в суперклассе и override при переопределении метода в подклассе.
Итак, мой вопрос:
Как правильно переопределять методы в C#?
Дополнительное примечание: Мне также интересно, применим ли тот же случай к методам перегрузки в C#.
Я не смог найти прямой вопрос по этому поводу в Stackoverflow, я собирался ответить.
@CodeNameJack Там некоторые, ни один из них особо не проголосовал. Угадайте, что большинство вопросов получают комментарии со ссылками на справочник по языку Microsoft.
Я бы посоветовал проверить ссылка на виртуальные ключевые слова и посмотреть на его ограничения, это даст вам хорошую основу для того, как и когда переопределить.
Я бы предложил модификатор переопределения Справочник по C# - там все сказано о том, как переопределить
@SirRufo Это не объясняет виртуальный модификатор, я добавил ответ не только с переопределением, но и с остальными модификаторами наследования и образцом





Следующее взято из Википедии (см. здесь, раздел C#).
«C# поддерживает переопределение методов, но только если явно запрошено с помощью модификаторов override и либо virtual, либо abstract.*)
abstract class Animal {
public String Name {get; set; }
// Methods
public void Drink();
public virtual void Eat();
public void Go();
}
class Cat : Animal {
public new String Name {get; set; }
// Methods
public void Drink(); // warning: hides inherited drink(). Use new
public override void Eat(); // overrides inherited eat().
public new void Go(); // hides inherited go().
}
При переопределении одного метода другим сигнатуры двух методов должны быть идентичными (и иметь одинаковую видимость). В C# можно переопределить методы класса, индексаторы, свойства и события».
*) Как правильно упомянул Брэдбери9, на странице Википедии есть ошибка, поэтому я немного изменил ответ (добавил текст, выделенный жирным шрифтом выше)
Цитата из вики неверна. Это правда, что это должно быть явно объявлено, но оно должно читаться как «и virtual или abstract». Как бы то ни было, в нем отсутствует ключевое слово abstract. Я бы посоветовал вам отредактировать вики и свой ответ или изменить ссылку на ссылку MS.
@bradbury9 - Спасибо за подсказку, вы абсолютно правы. Я изменил ответ и добавил сноску. Кроме того, я обновил текст Википедии.
Существует два разных способа переопределения в .net в зависимости от того, хотите ли вы предоставить реализацию по умолчанию или нет.
abstract классов.Есть и другие ключевые слова, связанные с наследованием, такие как:
abstract или virtual.Пример:
public abstract class Bank
{
public abstract string Country { get; } // Everything inheriting must implement it
public virtual decimal TaxPercent { get { return 0.25; } } // Implementing it is optional
public decimal DeclareTaxes()
{
decimal taxesToPay = 4000 * TaxPercent;
return taxesToPay;
}
}
public sealed class BahamasBank: Bank
{
public override string Country { get { return "Bahamas"; }
public override TaxPercent { get { return 0.0; } } // Bahamas is different from most countries in tax related stuff
}
public sealed class CanadaBank: Bank
{
public override string Country { get { return "Canada"; }
}
Ключевое слово
virtualозначает «Это реализация по умолчанию, которую можно переопределить». Ключевое словоabstractозначает «Это всегда должно быть переопределено». По понятным причинам вы не можете использоватьabstract, если класс также не являетсяabstract. Правильный путь зависит от того, что вам нужно.