继承
继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。
C# 和 .NET 不支持多重继承,也就是只能继承自一个类,但是继承可以传递。C#类始终继承自一个基类(如果未在声明中指定一个基类,则继承自System.Object
)。
可以使用接口来模拟多重继承。
静态构造函数、实例构造函数、终结器 无法被继承。
基类和派生类
一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。
class <派生类> : <基类>
{
...
}
父类的构造函数会优先于子类执行。
当采用 参数化构造函数 时,子类构造函数需继承父类。
若子类中存在父类同名的方法/属性,则子类实例调用时优先用子类的(但不会导致父类的被覆盖),可以通过base
访问父类的内容
class Tabletop : Rectangle
{
public Tabletop(double l, double w) : base(l, w)
{ }
public void Display()
{
Console.WriteLine(base.Display());
}
}
多态 (静态重载 和 动态重写)
多态是同一个行为具有多个不同表现形式或形态的能力。
静态多态性中,在编译时发生
- 函数重载
同一个范围内相同的函数名可以有多个定义。函数参数列表中的参数类型和个数不能完全相同(具有唯一签名)。 - 运算符重载
重载运算符是具有特殊名称的函数,通过关键字operator
后跟运算符的符号来定义,可以让运算符对某个类的实例生效,并自定义其运算规则。运算符必须为public
和static
。
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
动态多态性中,在运行时发生
override
关键字用于修改方法,具有override
关键字修饰符的方法是对基类中同签名方法的新实现,基类中的同名方法必须声明为virtual
或abstract
类型。给基类中的方法添加virtual
关键字表示可以在派生类中重写它的实现。
new、static和virtual关键字不能与override修饰符一同使用
- 抽象类
abstract
C# 允许使用关键字abstract
创建抽象类。抽象类可以包含抽象方法(即不实现的方法),派生类必须实现基类的抽象方法。- 抽象类不能创建实例。
- 抽象方法是没有实现代码的虚方法。只能在抽象类中声明,且不能被实现。必须在所有非抽象派生类中重写抽象方法。
- 由于密封类
sealed
不能被继承,抽象类不能被声明为 sealed。 - 和接口的区别:
- a. 抽象类可以有构造方法,接口中不能有构造方法。
- b. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
- c. 抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的。
- d. 抽象类中的抽象方法的访问权限可以是 public、protected 和(默认类型,虽然 eclipse 不报错,但也不能用,默认类型子类不能继承),接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
- e. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public static final 类型的,并且默认即为 public static final 类型。
- f. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
using System;
namespace InheritanceApplication
{
abstract class Father
{
public int num = 10;
abstract public void Fun();
}
class Son : Father
{
public override void Fun()
{
Console.WriteLine(num);//10
}
}
class FatherTester
{
static void Main(string[] args)
{
Son son = new Son();
son.Fun();
Console.ReadKey();
}
}
}
- 虚方法
visual
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。- 虚方法在基类中必须有实现(哪怕是空的 {} )
- 子类可以重写也可以不重写虚方法
using System;
namespace InheritanceApplication
{
class Father
{
public int num = 10;
public virtual void Fun()
{
Console.WriteLine("执行基类");
}
}
class Son : Father
{
public override void Fun()
{
Console.WriteLine(num);//10
}
}
class FatherTester
{
static void Main(string[] args)
{
Father father = new Father();
father.Fun();
Son son = new Son();
son.Fun();
Console.ReadKey();
}
}
}
- 强制重写
new
使用new
可以直接强制重写基类中的同名方法。- 抽象方法不能通过
new
重写,必须override - 普通方法和虚方法都可以通过
new
重写
- 抽象方法不能通过
class Son : Father
{
public new void Fun()
{
Console.WriteLine(num);
}
}
网友评论