Как скрыть свойство базового класса в C #? - PullRequest
1 голос
/ 02 февраля 2011

У меня есть следующее свойство в классе:

protected Int32 MyProperty { get; set; }

и в производном классе я хочу переопределить его:

protected Long MyProperty {get ;set; }

Это единственный способ сделать этос ключевым словом new, чтобы свойство базового класса можно было скрыть?

Ответы [ 4 ]

3 голосов
/ 02 февраля 2011

Другой вариант, чем попытка переопределения таким способом, - сделать ваш класс универсальным;

public abstract class MyClass<T>
{
   public T MyValue{ get; set;}
}

public class MyIntClass : MyClass<int>
{}

public class MyLongClass : MyClass<long>
{}
3 голосов
/ 02 февраля 2011

Переопределения должны иметь ту же подпись, что и переопределение, поэтому вы не можете изменить тип поля.

2 голосов
/ 02 февраля 2011

Вы не переопределяете поле MyInt, вы создаете новое поле, через которое вам нужно указать new:

protected new Long MyInt = 0;

Если ваш код обращается к классу как к экземпляру вашего базового класса, он будет обращаться к нему как Int32, если вы вызываете свой подкласс напрямую, он будет обращаться к нему как Long:

public class MyClass
{
    protected int MyValue = 0;
}

public class MySubclass : MyClass
{
    protected new long MyValue = 0;
}

void Test()
{
    MyClass instance = new MyClass();
    instance.MyValue = 10; // int

    MySubclass instance2 = new MySubclass();
    instance2.MyValue = 10; // long

    MyClass instance3 = (MyClass)instance2;
    int value = instance3.MyValue; // int - value is 0.
}
0 голосов
/ 02 февраля 2011

Вы можете использовать либо override , либо new модификатор для свойства, чтобы переопределить его. Тем не менее, два свойства должны быть одного типа. Разница в том, что override также вызывается, если вы вызываете свойство класса Base, который на самом деле является классом Derived, а new используется, только если вы вызываете его для класса derived. См. эту интересную статью Джона Скита, объясняющую разницу. Как говорит Джон, если вы напишите

Base b = new Derived();
b.SomeMethod();

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

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