【注意】:c#中不允许多继承(单根性)
继承的出现:实现重用代码,节省开发时间。
1、继承:面向对象编程中提供的子类可以沿用父类某些行为和特征的一种方式。
当一个类继承另一个类时,被继承的类称为父类或基类;该类被称为子类或派生类。
子类自动拥有父类的某些字段、属性和方法等,不需要重新定义上述元素,只需要定义自己特定的新元素即可。
【特点】:
⑴、传递性;(即类B继承类A,类C继承类B,故类C同时拥有类A和类B的成员。)
⑵、相对性;(当描述一个类时,不能简单的定义该类是父类还是子类,而需要相对于其他类来言。)
⑶、单根性。(c#明确规定一个类只能有一个父类,但可以有多个子类。)
2、继承的实现:
【举例】:
⑴、定义一个父类
public class Animal
{
private String name;
public String Name
{
get{ return name; }
set{ name=value; }
}
public void Eat()
{
Console.WriteLine("111111");
}
public void Sleep()
{
Console.WriteLine("222222");
}
}
⑵、定义一个子类,使用“:”实现继承
public class Cat:Animal
{
public void CatchMouse()
{
Console.WriteLine("333333");
}
}
⑶、定义子类对象使用父类成员
class Program
{
static void Main(String [] args)
{
Cat cat=new Cat();
cat.Name="Tom";//子类对象调用父类的属性
cat.Eat();//子类对象调用父类的方法
cat.Sleep();//子类对象调用父类的方法
cat.CatchMouse();
}
}
【注意事项】:
1、若一个类没有继承任何类,则自动继承Object类。(Object类是一切类的根类,它定义了所有类最基本的方法和属性)
2、子类无法继承父类的构造方法,也无法拥有父类的私有成员。
(构造方法是一个特殊的方法,父类的构造方法可以在子类中调用,但不能随意调用;父类中的私有成员只能在父类中使用,在子类中无法调用。)
3、父类的引用可以指向子类的对象,但子类的引用无法指向父类的对象。(子类和父类必须满足“is-a”的关系,即“子类 is a 父类”。)
("Is-a”代表类之间或类与接口的继承关系,比如猫是动物,狗也是动物,都继承了动物的共同特性,再用OO语言实现时,应将猫和狗定义成两种类,均继承动物类。 )
【举例】:class Program
{
static void Main(string [] args)
{
Animal animal=new Cat();
animal.Name="Tom";
animal.Eat();
animal.Sleep();
}
}
4、创建子类对象时,先调用父类构造方法,再调用子类构造方法。
(在创建子类对象时,需要首先创建父类对象,如此子类对象才能使用父类的属性和方法)
【举例】:
public class Animal //父类
{
public Animal()
{
Console.WriteLine("Hello Animal!");
}
……
}
public class Cat:Animal //子类继承
{
public Cat()
{
Console.WriteLine("Hello Cat!");
}
public void CatchMouse()
{
Console.WriteLine("abcdefg");
}
}
class Program
{
static void Main(string [] args)
{
Cat cat=new Cat(); //创建对象
}
}
【结果】:Hello Animal!
Hello Cat!
【举例2】:将Animal类中的无参构造方法替换成有参的构造方法(系统报错)
public Animal (string name)
{
Name=name;
Console.WriteLine("Hello Animal!");
}
【原因】:在继承中,父类存在无参构造方法时,子类无需显式调用父类构造方法;
反之,当父类中不存在无参构造方法时,子类必须显式调用父类构造方法。
【举例】:public class Cat:Animal //子类继承
{
public Cat(string name):base(name) //使用base关键字调用父类的构造方法
{
Console.WriteLine("Hello Cat!");
}
public void CatchMouse()
{
Console.WriteLine("abcdefg");
}
}
3、base和this关键字:(不能在静态方法中使用)
⑴、base关键字:用于在子类中指代其父类对象的引用,其含义类似于“父类”。
【语法】:base(参数列表):用于在子类中调用父类中的构造方法;
base.成员名称:用于在子类中调用父类中的成员。
⑵、this关键字:用于在类中指代类的对象的引用,其含义类似于“自己”。
【语法】:this.成员名称:用于在本类中调用自己的成员。
4、访问修饰符protected:(专门用于继承关系的访问修饰符)仅用于在子类中访问父类的成员,访问范围为类自身及其子类。