2013-11-18 5 views
1

Я знаю, что в C# мы не можем переопределить не являющиеся виртуальные поля и методы, но у меня есть следующий случай:Переопределение нон виртуальной собственности

Class Base 
{ 
    public static int a {get;set;} 
    public static void b() 
    { 
     // it uses a 
    } 
    public static void c() 
    { 
     // it uses a 
    } 
    public static string d {get {return a.ToString();}} 
} 

Class MyClass :Base 
{ 
    //... 
} 

теперь в моем классе MyClass я хочу, чтобы переопределить свойство a, что все Base class методы и свойство начать использовать перезаписываемое свойство, которое я реализовал, с учетом соображений, что я не имею доступа к изменению Base class

есть ли способ сделать это, даже если я должен был re-implement метод геттера этого свойства ?

+7

почему у вас все статические методы !? –

+0

@ DanielA.White это из сгенерированного файла из .net-структуры – Hilmi

+0

.net framework не генерирует классы (если вы не говорите об этом), пожалуйста, успокойтесь. –

ответ

3

Это статическое свойство, поэтому оно используется в форме Base.a. Независимо от того, что вы делаете, код вызова по-прежнему будет разрешен к классу Base, а затем к его статическому свойству a.

например

//old calling code 
Base.a = 7; // does not create an instance 
Console.WriteLine(Base.a); 

class MyClass :Base 
{ 
    public static string a {get; set;} 
} 

//new calling code 
MyClass.a = "some string"; // uses whatever a you defined in MyClass 
Console.WriteLine(MyClass.a); 
+0

Да, вы правы, я был немного смущен. Спасибо – Hilmi

2

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

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

Наконец, обратите внимание на то, что Дэниел в комментариях к вашему оригинальному сообщению заметил, что методы в базовом классе кажутся статическими. Так что даже если у вас есть доступ к базовому классу, вы не сможете сделать их virtual. Фактически наличие нагрузок статических методов, как правило, плохой дизайн, за исключением особых случаев, таких как объекты-объекты или контейнеры метода расширения.

+1

Это не вводит переопределяющую семантику, как задает вопрос. Также нет необходимости использовать 'new', чтобы иметь свойство с тем же именем в классе наследования; при этом свойства, являющиеся статическими, не имеют ничего общего с тенью. – Servy

+0

Правильно, единственный способ получить правильное переопределение - это сделать базовый метод 'virtual'. Скрытие свойств и состава базового класса - единственная альтернатива, о которой я знаю. Однако они служат различным целям, и каждый из них зависит от того, кто хочет делать то, что они хотят. – CompuChip

+0

Свойство статично, поэтому оно даже не может быть виртуальным, если он хочет, чтобы он был виртуальным. – Servy

Смежные вопросы