C# 继承
1.我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父亲;
2.继承的特性
(1)继承的单根性,一个子类只能有一个父类;
(2)继承的传递性
3.object是所有类的基类
4.子类继承了父亲,那么子类从父亲哪里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段
5.问题:子类有没有继承父类的构造函数?
答:子类没有继承父类的构造函数,但是子类会默认的调用父类无参数的构造函数,来创建父类对象,这样才能让子类可以调用父类中的所有成员,
所以如果在父类中重新写了一个有参数的构造函数之后,
那个无参数的构造函数就被干掉了,
子类就调用不到无参数的构造函数,所以子类会报错.
解决方法:
在父类中重新写一个无参数的构造函数;(但是这种方法不推荐,父类中写了一个有参数的构造函数,再写一个无参数的构造函数,而子类中的构造函数中的代码可能会和父类中有参数的构造函数的部分代码,有重复现象,所以不推荐)
在子类中显示的调用父亲的构造函数,使用关键字:base();(这种方法子类中的构造函数代码只要写自己独有的属性赋值代码就行。调用了父类的有参数的构造函数,说明父类的对象也创建了,子类也就可以继承父类中的成员了)
6.代码块:父类:Person;子类:student ;teacher ,driver
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01_继承
{
internal class Person
{
public Person(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
//方法1
//public 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 CHLSS() { Console.WriteLine("吃喝拉撒睡"); }
}
}
子类:
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01_继承
{
internal class Driver : Person
{
public Driver(string name, int age, char gender, int driveTime) : base( name, age, gender)
{
this.DriveTime = driveTime;
}
public int _driveTime;
public int DriveTime { get { return _driveTime; } set { _driveTime = value; } }
public void Drive()
{ Console.WriteLine("司机会开车"); }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01_继承
{
internal class Student:Person
{
public Student(string name, int age, char gender, int id) : base(name, age, gender)
{
this.Id = id;
}
private int _id;
public int Id { get { return _id; } set { _id = value; } }
public void Study()
{
Console.WriteLine("学生会学习");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01_继承
{
internal class Teacher : Person
{
public Teacher(string name, int age, char gender, int salary) : base(name, age, gender)
{
this.Salary = salary;
}
private double _salary;
public double Salary
{
get { return _salary; }
set { _salary = value; }
}
public void Teach() { Console.WriteLine("老师会讲课"); }
}
}
7.关键字"new",有两个作用:
1.创建对象
2.隐藏从父类那里继承过来的同名成员,隐藏的后果就是从子类调用不到父类的成员(换句话说子类中的成员尽量不要和父类中的成员同名)