В чем разница между скрытием метода и теневым копированием в C #? - PullRequest
4 голосов
/ 01 марта 2012

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

Ответы [ 5 ]

16 голосов
/ 01 марта 2012

В чем разница между скрытием метода и теневым копированием в 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.

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

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

4 голосов
/ 01 марта 2012

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

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

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

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

2 голосов
/ 01 марта 2012

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

На языке 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, так что вот что мы получаем.

2 голосов
/ 01 марта 2012

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

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

2 голосов
/ 01 марта 2012

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

Скрытие метода == shadowing.

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

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

...