什么是继承
定义:继承是面向对象编程语言中的一个重要特性,当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系。被继承的类B称为父类或基类,继承了父类的类A称为子类或派生类。
继承的优点
1. 减少代码冗余
2. 提供代码重用
3. 减少代码量以及提高代码可读性
4. 代码易于管理以及可划分父类和子类
5. 通过子类重写父类的功能可支持代码扩展
继承的缺点
1. 父类变,子类不得不变,继承会破坏包装。父类实现细节暴露给子类,其实是增大了两个类之间的耦合性
2. 在继承结构中,很多数据成员仍然没有被使用,分配给他们的内存没有被利用;因此,如果你没有正确地使用继承,将影响程序性能
继承的特点
1. 密封seald 类和密封方法不能被继承,静态类和普通类的静态成员也不能被继承
2. 派生类除了继承父类的特性外,还可以有自己独有特性
3. 子类不能拥有父类的私有成员
4. 子类可以以自己的方式实现父类的功能(即方法重写)
继承的特性
单根性:一个子类只能有一个父类
传递性:由A:B B:C=>A:C
实现继承
如果要声明派生自另一个类的一个类,就可以使用下面的语法 :
class MyDerivedClass: MyBaseClass
{
// functions and data members here
}
如果类(或结构)也派生自接口,则用逗号分隔列表中的基类和接口 :
public class MyDerivedClass: MyBaseC1ass, IInterface1, IInterface2
{
// etc.
}
对于结构,语法如下 :
public struct MyDerivedstruct: IInterface1, IInterface2
{
// etc.
}
如果在类定义中没有指定基类,C#编译器就假定System.Object是基类。因此下面的两段代码 生成相同的结果 :
class MyClass: object // derives from System.Object
{
// etc.
)
和
class MyClass // derives from System.Object
(
// etc.
)
第二种形式比较常用,因为它较简单。 C#支持object关键字,它用作System.Object类的假名,所以也可以编写下面的代码 :
class MyClass:Object // derives from System.Object
(
// etc.
)
多重继承
多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。与单一继承相对,单一继承指一个类别只可以继承自一个父类。
C# 不支持多重继承。但是,可以使用接口来实现多重继承。下面的程序演示了这点:
using System;
namespace InheritanceApplication
{
class Shape
{
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
protected int width;
protected int height;
}
// 基类 PaintCost
public interface PaintCost
{
int getCost(int area);
}
// 派生类
class Rectangle : Shape, PaintCost
{
public int getArea()
{
return (width * height);
}
public int getCost(int area)
{
return area * 70;
}
}
class RectangleTester
{
static void Main(string[] args)
{
Rectangle Rect = new Rectangle();
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 打印对象的面积
Console.WriteLine("总面积: {0}", Rect.getArea());
Console.WriteLine("油漆总成本: ${0}" , Rect.getCost(area));
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
要点:
- 子类不仅继承了父类的公有成员,同时继承了父类的私有成员,只是父类的私有成员在子类中不可被访问;
- C#只允许单继承,一个类只能继承于一个父类;
- 被“sealed”关键字修饰的类将不能被继承;
- 被“protected”修饰的成员或者数据可以直接被派生类访问,属于“可以在家族里分享的秘密”。
- 善用“base”关键字,显示调用合适的自定义基类构造函数而不是使用默认构造函数。
- 继承需要合理使用才能发挥最佳效果,一般情况下适用于“is a”关系,不适用“has a”关系。
- System.Object是所有类型的基类
- C#中继承的写法,class A:B{ }
- 构造方法不能继承