我在C#中有一个与OOP概念相关的小查询.
我有一个界面
interface intf
{
string Hello();
}
Run Code Online (Sandbox Code Playgroud)
基类
public class BaseClass
{
public string Hello()
{
return "Hello of base class called";
}
}
Run Code Online (Sandbox Code Playgroud)
从类中派生BaseClass并实现接口intf的子类
public class ChildClass : BaseClass, intf
{
string Hello()
{
return "Hello of child class called";
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是当我ChildClass在调用hello方法时创建一个对象时,它总是调用hello方法BaseClass.首先,为什么它叫Hello的BaseClass?其次,我怎么能叫Hello的ChildClass?
private void Form1_Load(object sender, EventArgs e)
{
ChildClass obj = new ChildClass();
MessageBox.Show(obj.Hello());
}
Run Code Online (Sandbox Code Playgroud)
首先,您没有为Helloin 提供访问修饰符ChildClass.这使其默认为私有.要从类外部访问该方法,请标记它public(或者internal如果从同一名称空间使用它).就目前而言,唯一公开可见的Hello方法是基类方法.
其次,一旦解决了访问问题,Hello就会将方法隐藏在基础中.如果这是故意的,建议new在方法中使用关键字
public new string Hello()
Run Code Online (Sandbox Code Playgroud)
如果您的意图不是隐藏方法而是覆盖它,则在基类中将方法标记为虚拟,并在子级中使用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";
}
}
Run Code Online (Sandbox Code Playgroud)
这将允许您始终调用子方法,除非您从子内显式调用基本方法.
来自外界的这样的呼唤
((BaseClass)child).Hello();
(child as BaseClass).Hello();
BaseClass baseClass = new ChildClass();
baseClass.Hello();
Run Code Online (Sandbox Code Playgroud)
将导致使用子方法.
调用像这样从内子类
base.Hello();
Run Code Online (Sandbox Code Playgroud)
将导致使用基类方法.