在派生类上重用方法代码
本文关键字:方法 代码 派生 | 更新日期: 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()
。
然而,如果你想从派生类中允许不同的行为(或要求行为),那么你正在寻找的是使用abstract
或virtual
修饰符来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");
}
}