2009-10-18 3 views
1

Если у меня есть два класса, один из которых наследуется от другого, и я использую одно и то же имя метода/свойства в обоих случаях, как я могу заставить этот метод вызывать подкласс независимо от того, был ли текущий объект верните его в базовый класс.Наследование и переопределение методов/свойств

Например (посторонние детали опущены):

public class MyBase { 
    public int GetNumber() { 
     return 1; 
    } 
} 

public class MyDerived : MyBase { 
    public new int GetNumber() { 
     return 20; 
    } 
} 

MyDervied someVar = new MyDerived(); 
int derivedVar = someVar.GetNumber(); // 20 

MyBase baseVar = (MyBase)someVar; 
int baseVar = baseVar.GetNumber(); // 1 

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

+0

Возможно, я должен был разместить конкретный пример. Я пытаюсь использовать тот же базовый класс в WPF и ASP.NET. WPF использует INotifyPropertyChanged, поэтому я фактически пытаюсь изменить возвращаемый тип базы из списка на ObservableCollection . Первоначально я пытался использовать IList в базовом классе без везения. – Echilon

+0

Вместо изменения типа, возвращаемого методом, вы можете просто преобразовать данные в код WPF, который его использует. Если вы сохраните возвращаемый тип как List , вы можете просто передать возвращаемое значение в конструктор ObservableCollection. Вы можете задать новый вопрос с более подробной информацией, чтобы получить более конкретный совет. – dahlbyk

+0

Спасибо. Причина, по которой мне нужен ObservableCollection, связана с привязками к элементам управления, которые нуждаются в уведомлении об изменении. – Echilon

ответ

7

Ваш базовый метод должен быть помечен virtual, прежде чем вы сможете override.

public class MyBase { 
    public virtual int GetNumber() { 
     return 1; 
    } 
} 

public class MyDerived : MyBase { 
    public override int GetNumber() { 
     return 20; 
    } 
} 
1

Dahlbyk is right. new полезен, если вы хотите получить класс и добавить нового участника, но по совпадению у класса уже есть член с тем же именем. Это для добавления нового члена, а не для изменения поведения существующего.

class A 
{ 
    public void Foo() 
    { 
     Console.WriteLine("A.Foo()"); 
    } 
} 

class B : A 
{ 
    public new void Foo() 
    { 
     Console.WriteLine("B.Foo()"); 
    } 
} 

... 

A x = new A(); 
x.Foo(); // prints "A.Foo()" 

B y = new B(); 
y.Foo(); // prints "B.Foo()" 

A z = y; 
z.Foo(); // prints "A.Foo()", not "B.Foo()"! 

Обратите внимание на разницу в поведении при сравнении с переопределенный метод, который будет печатать "B.Foo()" в последнем случае.

+0

Спасибо. Возможно, я должен был разместить конкретный пример. Я пытаюсь использовать тот же класс в WPF и ASP.NET. WPF использует INotifyPropertyChanged, поэтому я фактически пытаюсь изменить возвращаемый тип базы из списка на ObservableCollection . – Echilon

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