C#继承概念建议

Ami*_*mit 0 c# oop

我在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.首先,为什么它叫HelloBaseClass?其次,我怎么能叫HelloChildClass

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

Ant*_*ram 6

首先,您没有为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)

将导致使用基类方法.