Скажем, у меня есть следующая функция:
Код: Выделить всё
public interface MyInterface
{
int GetNumber();
virtual int GetTwiceNumber()
=> 2 * GetNumber();
}
Я могу реализовать интерфейс в классе как таковом:
Код: Выделить всё
public class MyClass
: MyInterface
{
public int GetNumber()
=> 5;
}
Я могу получить доступ к функции GetNumber напрямую через класс, но мне нужно получить доступ к функции GetTwiceNumber, переосмыслив MyClass как MyInterface:
Код: Выделить всё
MyClass myObject = new();
Console.WriteLine(((MyInterface)myObject).GetTwiceNumber());
Выход:
Я хочу сделать MyInterface.GetTwiceNumber доступным напрямую из класса. В этом примере я, вероятно, мог бы просто скопировать код функции в класс, но для более крупных функций это было бы непрактично. Кроме того, если одна функция была отредактирована, а другая нет, это могло вызвать ошибки, которые было бы трудно отследить.
Я подумал:
Код: Выделить всё
public int GetTwiceNumber()
=> 2 * ((MyInterface)this).GetNumber();
Однако проблема в том, что как только я создаю в своем классе функцию с тем же именем, что и реализованная виртуальная функция, она переопределяет виртуальную функцию, запрещая мне доступ к виртуальной функции. функция, определенная в интерфейсе. В результате приведенный выше код просто выдаст исключение StackOverloadException.
Как я могу разрешить прямой доступ к виртуальной функции, определенной в интерфейсе, через реализованный класс, а не через реализованный класс? требовать от пользователя переинтерпретации класса как этого интерфейса, учитывая, что класс еще не переопределяет виртуальную функцию?
Подробнее здесь:
https://stackoverflow.com/questions/769 ... nted-class