2010-09-16 113 views
1

嗨, 我有一个与C#中的OOPS概念相关的小查询。C#继承概念建议

我有一个接口

interface intf 
{ 
    string Hello(); 
} 

甲基类

public class BaseClass 
{ 
    public string Hello() 
    { 
     return "Hello of base class called"; 
    } 
} 

一个子类是从BaseClass衍生并实现接口INTF以及

public class ChildClass : BaseClass, intf 
{ 
    string Hello() 
    { 
    return "Hello of child class called"; 
    } 
} 

现在我的问题是,当我创建一个ChildClass对象,然后当我调用hello方法时,它总是调用基类的hello方法。首先,为什么它会调用base的Hello,其次,我怎样才能调用子类的Hello。请指教

private void Form1_Load(object sender, EventArgs e) 
{ 
     ChildClass obj = new ChildClass(); 
     MessageBox.Show(obj.Hello()); 
} 

感谢

+0

为什么要在界面上声明该方法呢?你想达到什么目的?另外,您是否意识到可以明确实现接口的事实? – 2010-09-16 03:51:38

+0

嗯,我只是想学习conepts和是的,我知道如果我做intf.hello这将调用我的接口方法。感谢您的回复 – Amit 2010-09-16 03:57:12

回答

3

为什么叫你好基地

你的孩子类实现的接口,因此它被认为含有一个公共你好方法。但是在你的孩子班里,你好不公开。基类中的Hello方法是公共的,并且被认为是接口的实现。

如何调用子类

你好充分利用你好在子类中公开。然后它将被考虑到接口的实现。

2

声明在基类virtual的方法,然后override它的子类。这样,虚拟调用将解析为子类而不是父类。

更新: 回答关于为什么它仍然基本方法,你在方法声明中把new即使经过这样的问题:

默认情况下,类成员是私有的。因此,由于您没有将该方法标记为公开,该方法是私人的。因此,程序是强制调用基本方法,因为它是唯一可访问的方法。

+1

此外,在子类的方法应该是'公共' – 2010-09-16 03:51:57

+0

埃斯特班,谢谢你的答复,我同意,当我使用虚拟和覆盖关键字时,它会调用孩子的你好。现在,让我修改一下代码,并添加新的关键字到我的子类hello键,如果我现在检查它仍然调用base的hello。为什么? – Amit 2010-09-16 03:52:38

+0

检查生成项目时的错误和警告。如果你没有你的'virtual'和'override'关键字,你会得到如下警告:''App.ChildClass.Hello()'隐藏继承的成员'App.BaseClass.Hello()'。新的关键字,如果隐藏是打算。“ – Lee 2010-09-16 03:58:54

0

您目前声明您的方法的方式,ChildClass中的方法Hello()无法访问,因此调用BaseClass中的公共方法。你真正想要的是Esteban说过的,声明基本方法public virtual,派生方法public override,否则你的方法只是映射基类方法。

6

首先,您没有在ChildClass中提供Hello的访问修饰符。这使得它默认是私有的。要从课程外部访问该方法,请将其标记为public(如果使用相同的名称空间,则将其标记为internal)。就目前而言,唯一公开可见的方法的基类方法。

其次,一旦你解决了访问问题,Hello将隐藏该方法在基地。如果这是有意的,最好是用new关键字与方法

public new string Hello() 

如果你的目的是隐藏方法,而是要覆盖它,标志着在基类中的方法,虚拟和在子中使用override关键字。

public class ChildClass : BaseClass, intf 
{ 
    public override string Hello() 
    { 
     return "Hello of child class called"; 
    } 
} 

public class BaseClass 
{ 
    public virtual string Hello() 
    { 
     return "Hello of base class called"; 
    } 
} 

这将让你始终电话孩子的方法,除非你从孩子中明确调用基方法。

呼叫这样从外面的世界

((BaseClass)child).Hello(); 
(child as BaseClass).Hello(); 
BaseClass baseClass = new ChildClass(); 
baseClass.Hello(); 

会导致孩子的方法被使用。

呼叫这样从子类

base.Hello(); 

将导致基类的方法被使用。

0

就像其他人说的那样,在Child类的public override中设置Hello方法。

另外,恕我直言,你应该在基类中实现接口,而不是子类。但是这与你的方法没有被调用的事实无关。