在派生类上重用方法代码

本文关键字:方法 代码 派生 | 更新日期: 2023-09-27 18:02:05

我有一个像这样的基类

using System;
public class Message{
  public int id {get;set;}
  //a lot of properties here
  public void print(){
    Console.WriteLine("id is " + id );
    //a lot of write lines here
  }
}

和这样的派生

public class Comment : Message{
  public int parent_id {get;set;}
  //a lot of properties here
  public void print(){
    //???
  }
}

如何实现可以重用Message::print()代码的Comment方法print() ?

下面是ideone上的代码https://ideone.com/9af6UM

在派生类上重用方法代码

根据需要调用基类:

public void print()
{
    base.print();
}

或者重写基函数:

// Message class:
public virtual void print()
{
    // Code...
}
// Comment class:
public override void print()
{
    // Some code...
}

Update: c++翻译。调用基类:

public:
void print() {
    Message::print();
}

重写基函数:

// Message class:
public:
virtual void print() {
    // This line is the same as Console.WriteLine()
    // std::cout << "id is" << id << std::endl;
    // Code...
}
// Comment class:
public: 
void print() override {
    // Some code...
}

如果您只想使用基类的实现,那么请将其排除在派生类之外。

public class Comment : Message
{
    public int parent_id {get;set;}
    //a lot of properties here
}

现在你可以这样调用基本的print()方法:

var comment = new Comment();
comment.print();

如果想调用基类的实现做其他事情,可以引用base类(并在派生类中使用new关键字以避免编译器警告)。

public class Comment : Message
{
    public int parent_id {get;set;}
    //a lot of properties here
    public new void print()
    {
        base.print();
        // do additional work
    }
}

这取决于你想要达到的目标。如果您只是想从派生类调用print()方法,那么只需调用print()

然而,如果你想从派生类中允许不同的行为(或要求行为),那么你正在寻找的是使用abstractvirtual修饰符来abstract方法。

abstract基本上强制派生类为override方法print() '。

相比之下,

virtual允许派生类选择性地override方法。

注意base.不是必需的,调用base.print()调用派生类中的基方法,其中print()直接调用当前类的print()

这里有几个不同的例子。

public class Message
{
    public int id { get; set; }
    //a lot of properties here
    public virtual void print()
    {
        Console.WriteLine("id is " + id);
        //a lot of write lines here
    }
}
public class Comment : Message
{
    public int parent_id { get; set; }
    public override void print()
    {
        Console.WriteLine("Parent Id: {0}", parent_id); //print the parent id
        base.print(); //now tell the base class Message to execute print... 
    }
}
public class Message2 : Message
{
    public override void print()
    {
        Console.WriteLine("I am message two"); //print the parent id
        //note no base.print() so wont execute Message.print()
    }
}

public abstract class AbstractMessage
{
    public int id { get; set; }
    public abstract void print(); //<-- note abstract therefore the derrived classes MUST implement the print() method
}
public class Message3 : AbstractMessage
{
    public override void print() //<--- must be implemented
    {
        Console.WriteLine("Iam am message 3");
    }
}