Вопрос по c# – что означает «публичный новый виртуальный метод void ()»?

13

когда использовать новые виртуальные ключевые слова для украшения метода? что такое привязанность? Как определить интерфейс и добавить класс для наследования интерфейса. но используйте новый виртуальный, чтобы реализовать метод интерфейса.

<code> interface IPrinter
{
    void Print();
}

 public class PrinterOne : IPrinter
{
    public void Print() 
    {
        Console.WriteLine("PrinterOne.");
    }
}

public class PrinterTwo : PrinterOne
{
    public new virtual void Print()
    {
        Console.WriteLine("PrinterTwo.");
    }
}

public class PrinterThree : PrinterTwo
{
    public override void Print()
    {
        Console.WriteLine("PrinterThree.");
    }
}

public class PrinterFour : PrinterThree
{
    public override void Print()
    {
        Console.WriteLine("PrinterFour.");
    }
}

 static void Main(string[] args)
    {
        IPrinter iprinter = new PrinterFour();
        iprinter.Print();//the output is PrinterOne? why???
        Console.ReadLine();
    }
</code>
@hvd Извини тогда Likurg

Ваш Ответ

4   ответа
10

new Используемое ключевое слово - скрытие члена.

Я никогда не видел его в сочетании сvirtual Ключевое слово, имейте в виду. Это просто позволяет типам, которые происходят отPrinterTwo вoverride Print Реализация метода.

new Ключевое слово, используемое таким образом, позволяет типу скрывать членов базовых типов, но только если вы используете переменную самого типа.

Например, если вы должны были сделать:

PrinterOne one = new PrinterTwo();
one.Print();

Было быnot вызвать метод вPrinterTwo так как он не является частью цепочки наследования.

Что касается того, когда вы сделаете это ... когда вам действительно нужно по какой-то странной причине, о которой я не могу думать (может быть, отражение?), И вы не можете редактировать код вPrinterOne.

Лично я бы никогда этого не сделал.

Что касается того, почему вывод - принтер один ... вызовIPrinter.Print вызовет тип, для которого он определен (PrinterOne в этом случае), который вернет вас в моем примере оnew ключевое слово игнорируется, если вы не говорите с типом, который его имеет.

В основном, используяIPrinter аналогично использованиюPrinterOne в моем маленьком примере выше.

Чтобы решить проблему, сделайтеPrinterOne методvirtual и полностью исключить использованиеnew virtual вPrinterTwo.

11

new а такжеvirtual два (в основном,) несвязанные ключевые слова.

new означает, что это затеняет базовый метод.
virtual позволяет подклассам переопределять его.

Вызов метода через интерфейс приводит к вызову базового метода, поскольку базовый метод неvirtual и производные классы явно не реализуют интерфейс (что приведет к переопределению метода)

1

когда вам нужно предоставить собственную реализацию для метода, который не может быть переопределен. Так какPrinterOne.Print не является виртуальным методом, его нельзя переопределить. Вместо этогоnew Ключевое слово используется для создания идентичной сигнатуры метода, которая скрывает оригинальный метод. Новый метод будет использоваться вместо. Добавлениеvirtual ключевое слово this позволяет переопределить ваш новый метод путем получения классов.

Ваш новый метод, который скрывает оригинал, будет вызываться, только если вы вызываете его через определяющий контейнер (например,PrintTwo). Вызов этого интерфейса вызывает оригинальный метод. Имейте в виду, что метод никогда не был удален или заменен, поэтому оригинальная реализация все еще существует путем прямого доступа к интерфейсу.

4
new modifier

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

When used as a modifier, the new keyword explicitly hides a member inherited from a base class.

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

virtual modifier

http://msdn.microsoft.com/en-us/library/9fkccyh4.aspx

The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class.

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

Похожие вопросы