2009-06-18 2 views
1

Это сценарий:Доступ overrriden публичной собственности в C#

class BaseClass 
{ 
    public virtual string Prop {get; set;} 
} 

class ChildClass : BaseClass 
{ 
    public override string Prop {get; set;} 
} 

//program 
... 
ChildClass instance = new ChildClass; 
Console.WriteLine(instance.Prop); //accessing ChildClass.Prop 
... 

Вопрос заключается в том, как получить доступ BaseClass.Prop в экземпляре ChildClass? Будет ли кастинг делать трюк?

Console.WriteLine((instance as BaseClass).Prop); //accessing BaseClass.Prop 

-EDIT- Много людей предложили литья. В C++ это не сработает, потому что полиморфизм все равно будет гарантировать, что будет вызвано дочернее свойство. Не так ли в C#?

В C++ вы бы решить эту проблему, выполнив:

instance.(BaseClass::get_Prop()) 
+0

В ответ на ваше редактирование каста есть разница в C# между использованием переопределения, которое затем использует полиморфизм в смысле C++ (хотя вам нужно объявить свой BaseClass.Prop как виртуальный). «Новое» ключевое слово в C# позволяет объявить свойство с тем же именем, что и базовый класс. Это, очевидно, менее распространенный случай. Текущий код, который у вас есть (без модификатора на Base, переопределить модификатор на Child), не будет компилироваться. Вы должны получить «не может переопределить унаследованный элемент ... потому что он не отмечен как« виртуальная, абстрактная или переопределенная »ошибка. – micahtan

ответ

2

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

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

3

закиньте экземпляр ChildClass к экземпляру BaseClass; то есть использование:

((BaseClass)childClassInstance).Prop 
+0

Разве полиморфизм по-прежнему не должен называть дочернее свойство в этом случае? Я основываюсь на C++ здесь, возможно, C# отличается. Если это так, может кто-то это указать? –

+0

@David: литье работает из-за того, что может быть ошибкой в ​​исходном коде; свойство на самом деле не переопределено. –

+0

В C# у вас есть контроль над полиморфизмом в этом случае; если вы передадите свойству/методу «новое» ключевое слово, то приведение к базовому классу вызывает реализацию базового класса. Но если вы передадите свойство/method ключевое слово «переопределить», реализация производного класса всегда будет вызываться независимо от того, что. – mquander

1

Не получаете ошибку компилятора для этого кода?

В любом случае ChildClass.Prop не переопределяет BaseClass.Prop - он скрывает его. Вы действительно должны объявить его как

public new string Prop {get; set;} 

Вы можете получить доступ к любому члену базового класса через base.Member. В этом случае base.Prop.

+1

Ошибка компилятора - предполагается «новое». Однако он может получить предупреждение о компиляторе. – mquander

+0

Аха. Наверное, я думал о сообщении от ReSharper. –

+0

Это ново в C# 3.0 – maxbeaudoin

-2

Так же, как для любого базового элемента: base.Prop

+0

Код доступа к собственности не находится внутри класса, поэтому база не годится! –

1
Console.WriteLine(((BaseClass)instance).Prop); //BaseClass.Prop 

Это работает, потому что свойство не переопределяется, это скрыто. Если вы добавили ключевое слово «override» в свойство производного класса, оно больше не будет работать.

+0

Я имел в виду ovveride, чтобы быть там. Я только что добавил. –

+0

Тогда вы не можете этого сделать. Это точка переопределения. – mquander

+0

Итак, что вы имеете в виду, так это то, что невозможно получить доступ к базовому свойству? –

1
BaseClass baseInstance = instance as BaseClass; 
Console.WriteLine(baseInstance .Prop); //accessing BaseClass.Prop 
0

Свойство вашего ChildClass Prop скрывает свойство Prop свойства BaseClass. Это должно быть предупреждение компилятора.

EDIT: Вам нужно будет решить, какое поведение вы хотите, полиморфизм или объявление новой собственности, поскольку C# разрешает обоим.

  • использование виртуальных/переопределение для полиморфного поведения
  • использовать новый для «имя-новой, но-же» свойство поведения
+0

получил это и исправил его. –

0

Используйте new ключевое слово вместе с conversion и он должен работать

, такие как public new string Prop { [...] } и Console.WriteLine((instance as BaseClass).Prop);