在派生类上重用方法代码

时间:2016-08-11 03:58:31

标签: c# oop

我有一个像这样的基类

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(){
    //???
  }
}

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

以下是ideone https://ideone.com/9af6UM

上的代码

3 个答案:

答案 0 :(得分:2)

根据您的目的,调用基类:

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

或覆盖基本功能:

// Message class:

public virtual void print()
{
    // Code...
}

// Comment class:

public override void print()
{
    // Some code...
}

更新:根据要求提供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...
}

答案 1 :(得分:2)

如果您只想使用基类的实现,那么请将其从派生类中删除。

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
    }
}

答案 2 :(得分:1)

取决于您要实现的目标。如果您只想从派生类调用print()方法,则只需调用print()即可。

但是,如果您想允许派生类中的不同行为(或需要行为),那么您要查找的是abstract使用abstractvirtual的方法改性剂。

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");
    }
}