Насколько я понимаю, подкласс ведет себя точно так же, как родительский класс, за исключением дополнительных методов или методов, которые "переписываются" с помощью ключевых слов new
и override
. Видимо, это не правильно.
См. Код ниже (скобки сняты для удобства чтения)
class BIG
protected void Output(string text = "")
Console.WriteLine("BIG - " + text);
public void CallingOutput()
Output("Outputting...");
class SMALL:BIG
public new void Output(string text = "")
Console.WriteLine("SMALL - " + text);
class Program
static void Main(string[] args)
SMALL foo = new SMALL();
Я уже знаю, что могу скрыть BIG.Output(string)
в SMALL с ключевым словом new
. При прямом звонке работает отлично.
>> foo.Output("Outputting...")
SMALL - Outputting...
Вот где это противоречит моему пониманию. Я думал, что определение class SMALL:BIG
было точно таким же, как если бы я определил class SMALL
и скопировал и вставил весь метод из BIG. Короче, я думал, что МАЛЕНЬКИЙ класс выше был эквивалентен этому:
class SMALL
public void Output(string text = "")
Console.WriteLine("SMALL - " + text);
public void CallingOutput()
Output("Outputting...");
Видимо, это не правильно, потому что
>> foo.CallingOutput()
BIG - Outputting...
Он по-прежнему использует оригинальный Output(string)
из BIG
при косвенном вызове.
Как правильно сделать так, чтобы foo.CallingOutput()
вывел
"SMALL - Outputting..."
Предполагается, что у меня нет доступа к BIG
и я не могу вносить изменения. И я не хочу скрывать CallingOutput()
также потому, что это в основном переписывает класс.
(Да, скрытие CallingOutput()
делает это работает)
Я провел поиск, прежде чем опубликовать это, и нашел похожий вопрос в C++
. Однако ответить на этот вопрос невозможно.
- Я не верю этому. Такой мощный язык, и все же, нет никакого способа сообщить компилятору, какой метод какой.
- Это другой язык, поэтому этот пост разрешен, поскольку его нельзя считать дублированием.