2011-06-10 80 views
1

我想知道,如果有人可以请给我讲解一下:接口,继承和“新”的关键字

class Program 
{ 
    static void Main() 
    { 
     AnotherDerivedClass d = new AnotherDerivedClass(); 
     Console.WriteLine(d.PrintMessage()); 

     IMsg m = d as IMsg; 
     //Why this prints BaseClass. 
     //How does it know that IMsg is implemented in the BaseClass. 
     Console.WriteLine(m.PrintMessage()); 

     IMsg n = d as DerivedClass; 
     //Why this prints BaseClass and not DerivedClass 
     Console.WriteLine(n.PrintMessage()); 

     Console.Read(); 
    } 
} 

public interface IMsg 
{ 
    string PrintMessage(); 
} 

public class BaseClass : IMsg 
{ 
    public string PrintMessage() 
    { 
     return "BaseClass"; 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public new string PrintMessage() 
    { 
     return "DerivedClass"; 
    } 
} 

public class AnotherDerivedClass : DerivedClass 
{ 
    public new string PrintMessage() 
    { 
     return "AnotherDerivedClass"; 
    } 
} 
+0

你有什么问题? ...啊,我看到你的代码中有评论:) – 2011-06-10 14:20:35

+2

在问题主体中提问而不是在代码评论中更好,因为人们在代码清单中寻找问题的方法...... – Oded 2011-06-10 14:21:47

+0

I认为如果我在代码评论中提出问题,人们很容易理解我想要理解的内容。 – Asdfg 2011-06-10 14:24:59

回答

7

您已经在派生类替换实现,而不是覆盖它们。如果您使用BaseClass,则将使用原始实现。

您需要在基础虚拟的方法:

public class BaseClass : IMsg 
{ 

    public BaseClass() 
    { 

    } 

    public virtual string PrintMessage() 
    { 
     return "BaseClass"; 
    } 
} 

,并覆盖在派生类:

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
    { 

    } 

    public override string PrintMessage() 
    { 
     return "DerivedClass"; 
    } 
} 

让你指定的行为。

+0

我的理解是“新”关键字将隐藏基类实现。因此,如果基类实现是隐藏的,那么它是否会调用New实现? – Asdfg 2011-06-10 14:27:50

+2

@Asdfg,这不是它的工作原理。当基本方法没有做你想做的事情时,使用'new',它不是'virtual',不能被重写。但是,只有在您通过对派生类型的引用进行操作时,才会隐藏*基本实现。通过基类引用对象*将继续使用基本行为。这就是为什么在你真正打算在派生类中重写的基础方法上使用'virtual'修饰符是绝对可取的。 – 2011-06-10 14:33:20

+0

谢谢你的解释。 – Asdfg 2011-06-10 20:00:13