C#中关于继承的基础知识与C++对比
最近学习完了C#中关于继承的知识,发现其与C++许多方面不同,特在此总结以加深记忆。希望也可以帮助到想了解C#的朋友。
使用继承
一个需要注意的地方就是C#隐式公共继承,不能显示声明为public,private,或protected,此外,C#不允许多继承。例子如下:
class Mammal
{
// 定义一个哺乳动物基类
private string m_name;
public Mammal(string name);
public void Sleep();
public void Breath();
....//哺乳动物的共性,都会睡觉,呼吸等
}
class Horse:Mammal //继承
{
...//实现自己独有的方法
}
基类构造函数
在构造函数方面C#派生类调用基类构造函数,使用base,不像C++中直接使用基类名,例子如下:
class Horse:Mammal
{
public Horse(string name):base(name)
{
...
}
}
覆盖基类方法
有时候由于类变的越来越庞大,派生类中的方法不可避免的与基类方法重名,这时编译器将给出警告,如果你是有意要覆盖基类方法,则使用new关键字可消除警告,例子如下:
//假设基类Mammal也定义了Run方法
class Horse:Mammal
{
new public void Run() //派生类有意覆盖基类方法
{
...
}
}
声明重写方法
C#中同样可以声明虚方法,声明方式与C++相同,但在派生类中实现虚方法则有所不同,实现虚方法使用override关键字,没有使用override关键字视为覆盖父类方法,例子如下:
class Mammal
{
public virtual void Talk(); //声明虚方法,派生类需实现自己的Talk方法
...
}
class Horse:Mammal
{
public override void Talk() //实现自己的Talk方法
{
Console.WriteLine("Hahahaha");
}
}
创建扩展方法
扩展方法允许添加静态方法来扩展现有类型(包括类与结构),与C++的重载功能类似。扩展类型需要在静态类中定义,例子如下:
//假设为int类型定义一个取反的方法
static class ForInt
{
public static int Negate(this int i) //注意this关键字,需扩展的类型用this修饰,并且必须是第一个参数
{
return -i;
}
}
//使用如下:
int number=123;
Console.WriteLine($"number.Negate{number.Negate()}");