c # Наследование классов, какой идентификатор это настройка? - PullRequest
1 голос
/ 22 марта 2011
/// <summary>
/// Holds data associated with a label
/// </summary>
public class ArtworkDataLabel : ArtworkLabel
{
    public string Data { get; set; }
    public int ID { get; set; }

    public ArtworkDataLabel()
    {
        this.ID = 5;
    }
}    

/// <summary>
/// A template label
/// </summary>
public class ArtworkLabel
{
    public int ID { get; set; }
    snip
}

Это смущает меня, почему компилятор разрешает это, и какой ID устанавливается? Как я могу различать идентификаторы? Должен ли я переименовать один из идентификаторов во что-то другое?

Ответы [ 6 ]

3 голосов
/ 22 марта 2011

Вы скрываете свойство в базовом классе, неявно используя оператор new:

public new int ID { get; set; }

, который переопределяет метод.

2 голосов
/ 22 марта 2011

Скрывает член базового класса и устанавливает идентификатор дочернего класса.

1 голос
/ 22 марта 2011

ArtwordDataLabel.ID скрывает ArtworkLabel.ID, и вы должны увидеть компилятор, предупреждающий вас о том, что это происходит, и что вы должны использовать «new», чтобы указать, что это преднамеренно.Наблюдать за поведением действительно легко, изменив свойства обратно на традиционные свойства и включив некоторые записи трассировки.

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

1 голос
/ 22 марта 2011

здесь происходит то, что ID, объявленный в ArtworkDataLabel , скрывает ID, объявленный в ArtworkLabel. Если вы проверите Visual Studio, вы увидите, что это генерирует предупреждение . Если вы намереваетесь скрыть это свойство, вы можете использовать ключевое слово new следующим образом:

public new int ID {get;set;}

вот статья , которая объясняет эту функцию более подробно.

Надеюсь, это поможет:)

1 голос
/ 22 марта 2011

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

Чтобы включить этот сценарий, чтобы не было путаницы, вы должны пометить свойство ID в базовом классе как «виртуальное», а в подклассе «переопределить» его:

public class ArtworkDataLabel : ArtworkLabel
{
    public string Data { get; set; }
    public override int ID { get; set; }

    public ArtworkDataLabel()
    {
        this.ID = 5;
    }
}    

public class ArtworkLabel
{
    public virtual  int ID { get; set; }
}
0 голосов
/ 22 марта 2011

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

...