Доступ к переопределенной публичной собственности в C # - PullRequest
1 голос
/ 18 июня 2009

Это сценарий:

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())

Ответы [ 8 ]

3 голосов
/ 18 июня 2009

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

((BaseClass)childClassInstance).Prop
2 голосов
/ 18 июня 2009

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

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

1 голос
/ 18 июня 2009
BaseClass baseInstance = instance as BaseClass;
Console.WriteLine(baseInstance .Prop); //accessing BaseClass.Prop
1 голос
/ 18 июня 2009
Console.WriteLine(((BaseClass)instance).Prop); //BaseClass.Prop

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

1 голос
/ 18 июня 2009

Разве вы не получаете ошибку компилятора для этого кода?

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

    public new string Prop {get; set;}

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

0 голосов
/ 18 июня 2009

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

, например public new string Prop { [...] } и Console.WriteLine((instance as BaseClass).Prop);

0 голосов
/ 18 июня 2009

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

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

  • использовать виртуальный / переопределить для полиморфного поведения
  • использовать new для поведения свойства "new-but-same-name"
0 голосов
/ 18 июня 2009

Как и для любого базового члена: base.Prop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...