12继承
继承
我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,
单独的封装到一个类中,作为这些类的父类。
比如:我们写一个Person类作为基类
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
public void CHLS()
{
Console.WriteLine("我叫{0},今年{1}岁,我是{2}生", this.Name, this.Age, this.Gender);
}
public Person(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
}
然后再写个老师类基础于person类:
public class Teacher : Person
{
private int _salary;
public int Salary
{
get { return _salary; }
set { _salary = value; }
}
public void Teach()
{
Console.WriteLine("我是老师,我会教学");
}
public Teacher(string name, int age, char gender, int salary)
: base(name, age, gender)
{
this.Salary = salary;
}
}
然后再写个学生类基础于person类:
public class Student : Person
{
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
public void Study()
{
Console.WriteLine("我是学生,我会认真学习");
}
//显示调用 父类的有参构造函数
public Student(string name, int age, char gender, int id)
: base(name, age, gender)
{
this.Id = id;
}
}
Student、Teacher 子类 派生类
Person 父类 基类
这样在子类中就不用再写姓名,性别,年龄这三个字段和基本的方法,就减少了代码冗余
子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
如果子类调用一个有参的构造函数是不是也会调用父类的有参构造函数?
不会,因为默认只会调用无参的构造函数
子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数,
创建父类对象,让子类可以使用父类中的成员。要使用过一个类中的成员必须用类的实例来调用,所以子类继承父类的时候会调用父类的无参数构造函数,也就是在内存中子类的内存空间中 其实包含了一个父类的实例。子类既然能调用父类中的元素,说明内存中肯定已创建了父类了
所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,
子类就调用不到了,所以子类会报错。 父类构造函数需要参数,但你没有给它传参,如果是父类默认的无参构造函数的话不传参数也是不会报错的,但是一旦写了有参数的构造函数,默认的无参构造函数就没了,所以就报错了。
解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
继承的特性
1、继承的单根性:一个子类只能有一个父类。也就是只能继承一个类
2、继承的传递性:如果继承的基类也是一个派生类,那当前这个派生类也可以用他基类的基类里面的成员。(也就是用爷爷、爸爸、儿子,儿子最后能拥有全部)
Object是所有类的基类
任意类都直接或者间接的继承了object
new关键字
1)、创建对象
2)、隐藏从父类那里继承过来的同名成员。
隐藏的后果就是子类调用不到父类的同名成员。
如果父类和子类的函数名相同,在调用时只会调用到该子类中的这个函数,而不会掉用父类的 ,
但是这个时候会出现警告,如果想消除警告,在子类中的那个重复函数名加关键字new,隐藏从父类那里继承过来的同名成员。
格式:
public new void CHLS(){}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构