一、继承的概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 子类继承父类,父类派生子类
- 子类又叫派生类,父类又叫基类(超类)
- 子类继承父类成员,也可以有自己独立的成员
二、继承的条件
继承需要符合的关系:is-a的关系,比如: Cat is an Animal
三、继承的方式
class 子类:父类
{
}
四、继承中构造函数的访问关键字
父类构造函数和方法
class Animal
{
#region
public string Name { get; set; }//名字
public string Color { get; set; }//颜色
public string Kind { get; set; }//种类
public string Favorite { get; set; }//爱好
#endregion
//父类构造函数
public Animal() { }
public Animal(string name,string color,string kind)
{
this.Name = name;
this.Color = color;
this.Kind = kind;
}
//父类方法
public void Introduce()
{
string info = string.Format("我的名字叫{0},身穿{2}的衣服,我是{1},我爱吃{3}!", Name, Color, Kind, Favorite);
Console.WriteLine(info);
}
}
- this关键字
用来访问父类成员
class Dog : Animal
{
public Dog() { }
public Dog(string name, string color, string kind, string favorite)
{
this.Name = name;
this.Color = color;
this.Kind = kind;
this.Favorite = favorite;
}
}
- base关键字
1.调用父类的构造函数
2.调用父类的属性和方法
class Cat:Animal
{
public Cat() { }
public Cat(string name,string color,string kind,string favorite)
:base(name,color,kind)//1.调用父类构造函数
{
this.Favorite = favorite;
}
//跳舞
public void Dancing()
{
base.Introduce();//2.调用父类方法
Console.WriteLine("下面我给大家表演《小猫迪斯科》,请大家鼓掌啊:>");
}
}
五、protected关键字
访问修饰符,允许子类访问,不允许其他非子类访问
修饰符 | 类内部 | 子类 | 其他类 |
---|---|---|---|
public | 可以 | 可以 | 可以 |
private | 可以 | 不可以 | 不可以 |
protected | 可以 | 可以 | 不可以 |
六、抽象类与抽象方法
1.抽象类的概念
- 使用关键字abstract修饰的类,称为抽象类;
- 抽象类只是用来列举一个类所具有的行为,不能单独通过创建对象来使用。如Animal animal=new Animal()是错误的,但是可以通过实例化派生类来间接实例化抽象类,比如Animal animal=new Cat();
- 抽象类中可以有抽象方法,也可以没有任何抽象方法;
- 抽象类不能是静态的(static)或密封的(sealed),因为密封类不能被继承;
- 抽象类只能用来被继承。
2.抽象方法的概念
- 在抽象类中使用abstract修饰的方法,称为抽象方法;
- 抽象方法必须在抽象类中定义,不能在普通类中定义;
- 抽象方法只能是一个方法的声明,不能有任何方法体;
- 抽象方法仅仅表示一个应该具有的行为,具体怎么实现是由其子类实现的;
- 抽象方法在子类中被实现(重写)的时候必须使用关键字override;
- 子类必须重写父类的所有抽象方法,除非子类本身也是抽象类。
3.抽象类的使用场景
- 如果一个类设计的目点是用来被其它类继承的,它代表一类对象的所具有的公共属性或方法,那个这个类就应该设置为抽象类。
- 在实现接口时,常写一个抽象类,来实现接口中的某些子类中所需的通用方法,接着在编写各个子类时,即可继承该抽象类来用。省去在每一个都要实现通用的方法的困扰。
4.实例
- 例1
abstract class Animal
{
//父类Animal的抽象方法Have
public abstract void Have();
}
abstract class Cat: Animal
{
//因为此类为抽象类,所以不能重写父类中的抽象方法Have;反之如果在此类中不实现抽象方法Have的重写,则此类必须声明为抽象类
//Animal父类的子类Cat的正常方法Run
public void Run()
{
Console.WriteLine("Cat类的非抽象方法Run");
}
}
class Kitty: Cat
{
//因为此类为非抽象类,所以得重写所继承的所有抽象成员。由于抽象类Cat中没有抽象方法,所以只重写抽象类Animal中的抽象方法Have
public override void Have()
{
Console.WriteLine("重写Animal抽象类的抽象方法Have");
}
}
- 例2
public abstract class Animal
{
public string Name { get; set; }
public string Color { get; set; }
public abstract void GetMessage();
}
public class Cat:Animal
{
/// <summary>
/// 重写输出信息方法
/// </summary>
public override void GetMessage()
{
Console.WriteLine("姓名:{0},颜色:{1}",Name,Color);
}
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();//实例化子类Cat
cat.Name = "果果";
cat.Color = "白色";
cat.GetMessage();//调用Cat类中的GetMessage方法
Cat cat1 = new Cat();//实例化子类Cat
Animal ani = cat1;//通过使用子类实例化对象cat1间接来实例化抽象类Animal
//也可以直接声明为:Animal ani = new Cat();
ani.Name = "泡泡";
ani.Color = "黑色";
ani.GetMessage();//调用抽象类(父类)Animal中的GetMessage方法
Console.ReadLine();
}
}
- 例2 运行结果