0

我有一个带有子类几乎总是会覆盖的方法的基类。但是,我不想完全替换基类的方法,而是希望将子类中派生的任何内容添加到基类中已有的内容中。

例如:

class BaseClass{

public string str()
 {
   return "Hello my name is" ;
 }
}

class ChildClass : BaseClass{

public override string str() 
 {
   return "Sam";
 }
}

关键是如果我想通过创建 ChildClass 的实例来访问 str() 方法,字符串将打印为“你好,我的名字是 Sam”。

我一直在环顾四周,我发现这不应该发生,因为基类甚至不应该知道它正在被继承。那么,如果设计是错误的,我该怎么做呢?请记住,将有多个从 BaseClass 继承的子类。

谢谢

4

3 回答 3

8

如果您总是想这样做,并且不想依赖派生类的实现者记住重写方法调用基类,则可以使用模板模式:

public abstract class BaseClass
{
    public string str()
    {
        return "Hello my name is " + Name;
    }

    protected abstract string Name { get; }
}

BaseClass现在,编译器将要求任何继承的非抽象类覆盖Name,并且该值可以被BaseClass.

public class ChildClass : BaseClass
{
    protected override string Name
    {
        get { return "Sam"; }
    }
}

显然,这取决于基类是abstract.

于 2012-09-30T13:30:12.533 回答
2

如果要调用基类方法:

1.将基类中的方法声明为virtual,这样就可以override从子类中。

2.base用于从基类调用方法。

internal class BaseClass
{
    public virtual string str()
    {
        return "Hello my name is" ;
    }
}

class ChildClass : BaseClass
{
    public override string str(){
        return base.str() + "Sam";
    }
}
于 2012-09-30T13:26:43.273 回答
0

首先你必须制定你的方法,virual否则你不能覆盖它:

public class BaseClass
{
  public virual string Str()
  {
    return "Hello my name is ";
  }
}

然后在您的子类中,您可以使用它base来访问基类中的方法。

public class ChildClass : BaseClass
{
  public override string Str()
  {
    return base.Str() + "Sam";
  }
}
于 2012-09-30T13:30:48.447 回答