C#对象的继承详解


一、继承的概念

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

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

二、继承的条件

继承需要符合的关系: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 运行结果

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值