В чем разница между скрытием метода и теневым копированием в C#?

В чем разница между скрытием метода и теневым копированием в C#? Они одинаковые или разные? Можем ли мы назвать их полиморфизмом (время компиляции или время выполнения)?

5 ответов

Решение

В чем разница между скрытием метода и теневым копированием в C#?

Shadowing - еще один часто используемый термин для сокрытия. Спецификация C# использует только "скрытие", но любой из них приемлем.

Вы вызываете просто "скрытие метода", но существуют и другие формы скрытия, кроме скрытия метода. Например:

namespace N
{   
    class D {}
    class C 
    {
        class N
        {
            class D
            {
                 N.D nd; // Which N.D does this refer to?

вложенный класс N скрывает пространство имен N внутри D.

Можем ли мы назвать их полиморфизмом (время компиляции или время выполнения)?

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

Компилятор VB.NET называет это теневым копированием, в C# это называется сокрытием. Называя это теневым копированием в C#, это побочный эффект от VB.

И это предупреждение компилятора, по сути, это конфликт имен между базовым и производным классами.

Можем ли мы назвать их полиморфизмом (время компиляции или время выполнения)?

Это, конечно, не форма полиморфизма во время выполнения. Вызов скрытого или скрытого метода разрешается во время компиляции. Что делает это, как правило, не будет называться или считаться полиморфизмом.

Это просто два разных слова для одной и той же вещи, но они отличаются в контексте, в котором вы их чаще всего используете. Как правило, то, что называется "сокрытием", связано с полиморфизмом, а то, что называется "слежкой", - нет.

На языке C#, когда вы говорите "скрытие", вы обычно говорите о наследовании, где более производный метод "скрывает" метод базового класса от обычной цепочки вызовов унаследованного метода.

Когда вы говорите "тень", вы обычно говорите о области видимости: идентификатор во внутренней области видимости "скрывает" идентификатор в более высокой области видимости. В других языках то, что называется "сокрытием" в C#, иногда также называют "теневым".

Оба являются понятиями времени компиляции; они описывают, к какому объекту относится данный идентификатор в данном контексте, когда компилятор его связывает.

public class A
{
  public int B;
  public void C()
  {
    return this.B;
  }
}

public class D : A
{
  public int X;

  public new void C()
  {
    var X = 1.0m;
    return X;
  }
}

метод D.C() метод "скрывает" A.C(); как правило, вызов D.C() всегда будет вызывать в базовые классы A.C() метод, так как это не virtual, Мы не хотим этого; мы хотим D.C(), Очевидно, это то, чего вам следует избегать, потому что это сбивает с толку, особенно если вы начинаете бросать свои D на А, но оно существует, если вам это нужно. Также обратите внимание, что скрытие метода происходит автоматически: без new ключевое слово здесь, D.C() все еще прячется A.C() но мы получаем предупреждение, потому что обычно это не то, что вы хотите. new Ключевое слово просто дает понять, что это действительно то, что мы хотим.

Локальная переменная X в D.C() ученик теней D.X в рамках D.C() только. В этом случае есть две вещи в области, которые можно было бы по праву назвать X и компилятору нужны правила, чтобы сказать ему, какое из них вы имеете в виду. "Более местный" X тени "менее локальные" D.X так вот что мы получаем.

Два термина означают то же самое в C#.

Скрытие метода == слежка.

Вы можете использовать это как форму полиморфизма - когда вы не хотите, чтобы метод базового класса был видимым / доступным через наследующий класс.

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

Сокрытие имени C# (new модификатор) называется теневым копированием в VB.NET ( ключевое словоShadows).

Это можно рассматривать как полиморфизм только в том смысле, что переопределение является "полиморфизмом", то есть статическим или компиляционным. Это не полиморфизм в классическом смысле вызова виртуальных функций.

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