Обсуждение наследования C# от MTA

Вопрос об экзамене C# MTA, который я недавно провел, вызвал много дискуссий:

У вас есть класс с именем Glass, который наследуется от базового класса с именем Window. Класс Window включает защищенный метод с именем break ().

Как следует вызывать реализацию класса break метода break ()?

A. Window.break ();
B. Glass.break ();
C. this.break ();
D. base.break ();

Может ли кто-нибудь дать мне твердый ответ и рациональный для этого?

2 ответа

Решение

Я бы сделал это, просто позвонив Break();Пока Break() метод не объявлен как virtual (что позволяет переопределить его). Вызов с использованием this или же base просто избыточно.

Однако давайте скажем, что Break() будет объявлено виртуальным, то будет иметь значение, если вы захотите вызвать реализацию Break() в классе окна (base.Break()) или на уроке стекла (Break()/this.Break()).

Рассмотрим следующий код

public class Window
{
    public virtual void Break()
    {
        Console.WriteLine("Break in window called");
    }
}

public class Glass : Window
{
    public override void Break()
    {
        Console.WriteLine("Break in Glass called");
    }

    public void DoSomething()
    {
        Break();
        this.Break(); // Same as above line
        base.Break();
    }
}

Выход при звонке DoSomething() на примере Glass было бы

Break in Glass called
Break in Glass called
Break in window called

Вопрос:

Как следует вызывать реализацию класса break метода break ()?

пример

В этом примере у них есть класс с именем Glass, Этот класс имеет метод с именем Break() что исходит из базового класса Window,

Они хотят, чтобы вы вызвали реализованный метод в Glass class "вызвать реализацию класса break метода break ()"

Чтобы создать собственную версию метода базового класса, вам нужно сделать его доступным для записи. Для этого добавьте виртуальный метод в базовый класс и в производный класс Glass добавить переопределение, чтобы переопределить этот метод базового класса.]

Далее можно вызвать другую версию метода, производный метод и базовый метод. Смотрите пример для более подробной информации

Этот пример будет выглядеть так:

 class Window
 {
     public virtual void Break()
     {
           // break method from the window class 
     }
 }

 class Glass : Window
 {
     public override void Break()
     {
           // This method comes from the base class Window. You want to override this one. They ask you to call this method.

           //To call the Break() mehod from Window:
           base.Break();
           // Call the Break() method from the current instance
           this.Break()
           Break(); 
     }
 }

Ответ:

Этот ответ правильный, потому что этот вызывает текущий экземпляр с Glass class Break() method (См пример)

C: this.break ();

Другие ответы:

Break() не является статичным, потому что это не имеет никакого смысла и не может быть статичным в этом вопросе. Они хотят, чтобы Glass унаследовал от Window, и хотят вызвать Break() версия класса Glass. Вы должны переопределить Break() в классе Glass, чтобы создать собственную версию этого метода, из-за этого вам нужно добавить виртуальные и переопределить, а виртуальные / переопределенные методы нельзя сделать статическими. Из-за этого первые два ответа неверны

Window.Break()

Это вызовет статический метод Break() из класса Window. (static не используется в этом примере, это не ответ)

B Glass.Break()

Это вызовет статический метод Break() из класса. (static не используется в этом примере, это не ответ)

C этим.Break()

Это вызовет текущий экземпляр метода Break() (см. Пример).

D base.Break()

Это вызовет метод Break() из текущего экземпляра базового класса Window.

B. Glass.break();

Он не указан в задаче, откуда он вызывается, поэтому, поскольку должно быть только 1 правильное решение, единственно логичным способом было бы предположить, что он может быть вызван из любого места. Поэтому, если мы реализуем break () как открытый статический метод, мы сможем вызывать его из любого места, и B будет единственным логичным и возможным ответом.

using System;
public class Window{
    protected void break1() {Console.Write("1");}
    public Window(){
        Glass.break1();
    }
}
public class Glass : Window{
    public static void break1() {Console.Write("2");}
    public Glass() {
        Glass.break1();
    }
}
public class Dijete : Glass{
    public Dijete() {
        Glass.break1();
    }
}
public class Program
{
    public static void Main()
    {
        Glass.break1();
    }
}

Пожалуйста, исправьте мою логику, если я ошибаюсь, но на экзаменационных свалках я также нашел B как правильный ответ.

PS: я назвал это break1, потому что вызов функции break () не сработает, что фактически делает эту задачу бессмысленной.

Другие вопросы по тегам