2009-10-18 55 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 2009-10-19 07:10:10

+0

您可能只想在使用它的WPF代码中转换数据,而不是更改该方法返回的类型。如果保持返回类型为List ,则只需将返回的值传递给ObservableCollection的构造函数即可。你可能想问一个更多细节的新问题,以获得更具体的建议。 – dahlbyk 2009-10-19 07:44:26

+0

谢谢。我需要ObservableCollection的原因是由于控件上的绑定,它需要更改通知。 – Echilon 2009-10-20 10:09:16

回答

7

您的基本方法需要,然后才能override被标记virtual

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

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

达尔比克是对的。 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 2009-10-18 17:45:39