继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。
当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。
继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物。
一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。
C# 中创建派生类的语法如下:
<访问修饰符符> class <基类>
{
...
}
class <派生类> : <基类>
{
...
}
假如一个基类是Shape,一个派生类是Rectangle。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace week2._1
{
// 基类
class Shape
{
public void setLength(int len)
{
length = len;
}
public void setWidth(int wid)
{
width = wid;
}
protected int length;
protected int width;
}
//派生类
class Rectangle : Shape
{
private int height;
public int getArea()
{
return length * width;
}
}
class Program
{
static void Main(string[] args)
{
//创建对象
Rectangle rect = new Rectangle();
rect.setLength(5);
rect.setWidth(6);
Console.WriteLine(rect.getArea());
Console.ReadLine();
}
}
}
结果:
30
派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。您可以在成员初始化列表中进行父类的初始化。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace week2._1
{
class Rectangle
{
//成员变量
protected double width;
protected double lenght;
//构造方法
public Rectangle(double l, double w)
{
width = w;
lenght = l;
}
//面积
public double GetArea()
{
return width *lenght;
}
//显示
public void Display()
{
Console.WriteLine("长度:{0}", lenght);
Console.WriteLine("宽度:{0}", width );
Console.WriteLine("面积:{0}", GetArea());
}
//继承Rectangle
class Tabletop : Rectangle
{
private double cost;
public Tabletop(double l,double w) : base(l, w)
{
}
public double Getcost()
{
double cost;
cost = GetArea() * 70;
return cost;
}
//重写Display方法
public void Display()
{
//base.Display();
Console.WriteLine("成本:{0}", Getcost());
}
}
class Test
{
static void Main(string[] args)
{
Tabletop t = new Tabletop(4.5, 5.5);
t.Display();
Console.ReadKey();
}
}
}
}
结果:
成本:1732.5
多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。与单一继承相对,单一继承指一个类别只可以继承自一个父类。
C# 不支持多重继承。但是,您可以使用接口来实现多重继承。下面的程序演示了这点:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace week2._1
{
class Shape
{
protected int width;
protected int height;
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
}
//基类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 test
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
int area;
r.setHeight(7);
r.setWidth(8);
area = r.getArea();
Console.WriteLine(area);
Console.WriteLine(r.getCost(area));
Console.ReadKey();
}
}
}
结果:
56
3920
关于继承的几点:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace week2._1
{
class Program
{
class father
{
public father()
{
Console.WriteLine("father");
}
}
class son : father
{
public son()
{
Console.WriteLine("son");
}
}
static void Main(string[] args)
{
son s = new son();
Console.ReadKey();
}
}
}
结果:
father
son