我在C#中有一个与OOP概念相关的小查询.
我有一个界面
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方法BaseClass
.首先,为什么它叫Hello
的BaseClass
?其次,我怎么能叫Hello
的ChildClass
?
private void Form1_Load(object sender, EventArgs e) { ChildClass obj = new ChildClass(); MessageBox.Show(obj.Hello()); }
Anthony Pegr.. 6
首先,您没有为Hello
in 提供访问修饰符ChildClass
.这使其默认为私有.要从类外部访问该方法,请标记它public
(或者internal
如果从同一名称空间使用它).就目前而言,唯一公开可见的Hello
方法是基类方法.
其次,一旦解决了访问问题,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();
将导致使用基类方法.
首先,您没有为Hello
in 提供访问修饰符ChildClass
.这使其默认为私有.要从类外部访问该方法,请标记它public
(或者internal
如果从同一名称空间使用它).就目前而言,唯一公开可见的Hello
方法是基类方法.
其次,一旦解决了访问问题,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();
将导致使用基类方法.