Я чувствую здесь запах кода. Я считаю, что вы должны наследовать базовый класс только в том случае, если вы реализуете все функции этого базового класса. То, что вы делаете, на самом деле не совсем правильно представляет принципы объектно-ориентированного программирования. Таким образом, если вы хотите наследовать от своей базы, вы должны реализовать Name, иначе у вас будет неправильное наследование. Ваш класс A должен быть вашим базовым классом, и ваш текущий базовый класс должен наследоваться от A, если вы этого хотите, а не наоборот.
Однако не отклоняйтесь слишком далеко от прямого вопроса. Если вы действительно хотели нарушить «правила» и хотите продолжить путь, который вы выбрали, вот как вы можете это сделать:
Соглашение состоит в том, чтобы реализовать свойство, но генерировать NotImplementedException при вызове этого свойства, хотя мне это тоже не нравится. Но это мое личное мнение, и оно не меняет того факта, что эта конвенция остается в силе.
Если вы пытаетесь сделать свойство устаревшим (и оно объявлено в базовом классе как виртуальное), вы можете либо использовать для него атрибут Obsolete:
[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
(Редактировать: Как указал Брайан в комментариях, второй параметр атрибута вызовет ошибку компиляции, если кто-то ссылается на свойство Name, поэтому он не сможет его использовать, даже если вы мы реализовали его в производном классе.)
Или, как я уже упоминал, используйте NotImplementedException:
public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Однако, если свойство не объявлено как виртуальное, вы можете использовать новое ключевое слово для его замены:
public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
Вы по-прежнему можете использовать атрибут Obsolete так же, как если бы метод был переопределен, или вы можете создать исключение NotImplementedException, в зависимости от того, что вы выберете. Я бы, вероятно, использовал:
[Obsolete("Don't use this", true)]
public override string Name { get; set; }
or:
[Obsolete("Don't use this", true)]
public new string Name { get; set; }
В зависимости от того, был ли он объявлен виртуальным в базовом классе.
person
BenAlabaster
schedule
09.12.2009
L
в SOLID). - person jason   schedule 09.12.2009