C#对象的继承详解

目录

  • 一、继承的概念
  • 二、继承的条件
  • 三、继承的方式
  • 四、继承中构造函数的访问关键字
  • 五、protected关键字
  • 六、抽象类与抽象方法
    • 1.抽象类的概念
    • 2.抽象方法的概念
    • 3.抽象类的使用场景
    • 4.实例


一、继承的概念

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

  • 子类继承父类,父类派生子类
  • 子类又叫派生类,父类又叫基类(超类)
  • 子类继承父类成员,也可以有自己独立的成员

二、继承的条件

继承需要符合的关系: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
{
	/// 
    /// 重写输出信息方法
    /// 
    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 运行结果

你可能感兴趣的:(C#学习笔记,c#,开发语言)