переопределить ToString () с переопределением и новым ключевым словом - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в c #. Смущаюсь этим вопросом.

У меня есть переопределение ToString () с переопределением и новым ключевым словом. Оба дают мне один и тот же результат. В чем разница между обоими.

вот мой пример

class A
{
    public new string ToString()
    {
        return "With New Keyword";
    }
}
class B
{
    public override string ToString()
    {
        return "With Override Keyword";
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        Console.Read();
    }

}

выход

с новым ключевым словом

с переопределением ключевого слова

Я знаю, это глупый вопрос. пожалуйста, кто-нибудь, помогите мне дать мне разницу между обоими методами.

Я не спрашиваю о разнице между новым и ключевым словом переопределения. Я хочу знать разницу между обоими методами. В концепции методов переопределения объекта.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Это имеет значение, когда вы делаете это:

object a = new A(); // notice the type of the variable here!
object b = new B();
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());

a.ToString() не будет вызывать вашу реализацию ToString и вместо этого вызовет object.ToString, которая возвращает полностью определенное имя типаобъект.b.ToString() будет вызывать вашу реализацию.

То, что вы сделали в B, называется переопределением.То, что вы сделали в A, называется сокрытием .Сокрытие теряет свой эффект, когда тип времени компиляции переменной больше не тот тип.Ваша реализация ToString будет вызываться только тогда, когда тип времени компиляции будет A.

Подробнее здесь .

0 голосов
/ 25 апреля 2018

В классе B вы переопределяете ToString() метод, который Object.ToString(), потому что вы не унаследовали A. Теперь рассмотрим приведенный ниже пример,

class A
{
    public string ReturnString()
    {
       return "ClassA::Method";
    }
}
class B : A
{
    public newstring ReturnString()
    {
        return "ClassB::Method";
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        Console.Read();
    }
}

Здесь вы скрываете метод в class B, поскольку вы унаследовали Class A. Таким образом, вы получите вывод как ClassA::Method для обоих вызовов методов.

Теперь рассмотрим пример ниже

class A
{
    public virtual string ReturnString()
    {
       return "ClassA::Method";
    }
}
class B : A
{
    public override string ReturnString()
    {
        return "ClassB::Method";
    }
}


class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        Console.WriteLine(a.ToString());
        Console.WriteLine(b.ToString());

        Console.Read();
    }
}

Здесь мы переопределили метод Class A's в Class B. Это означает, что ClassB method похоже на расширение, или вы можете сказать, что оно имеет другое значение, чем ClassA. Вы получите вывод, как показано ниже

ClassA::Method
ClassB::Method
0 голосов
/ 25 апреля 2018

Вы можете легко погуглить это.

С MSDN

В C # метод в производном классе может иметьто же имя, что и метод в базовом классе.Вы можете указать, как методы взаимодействуют, используя ключевые слова new и override.Модификатор переопределения расширяет метод базового класса, а новый модификатор скрывает его.Различие проиллюстрировано в примерах в этом разделе.

В консольном приложении объявите следующие два класса, BaseClass и DerivedClass.DerivedClass наследуется от BaseClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...