我有一个像这样的基类
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
上的代码答案 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
使用abstract
或virtual
的方法改性剂。
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");
}
}