继承
/*
* 我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,
* 单独的封装到一个类中,作为这些类的父类。
*
* 继承的语法:
* 只需要把父类的类名写在类名的后面,中间加一个“:”号即可
*
* class 类名:父类类名
*
* 一旦继承了某个类,那么就会拥有那个类的特征(成员变量)和行为(成员方法)
* 被继承的类称之为父类或者基类,继承了其他类的类叫子类或者派生类
* 总结:
* 1.继承的单根性:一个类只能有一个父类,单继承
* 2.继承的传递性:A类被B类继承,B类被C继承,那么C类就拥有A类和B类所有成员变量和方法
*
* 三.继承中的构造方法:
* 构造方法不能被继承,但子类会自动调用父类的构造方法,以帮助子类初始化成员变量
*
* 四.通过使用base关键字,派生类的构造方法可以显式调用基类的构造方法,运行时,首先执行基类构造方法,然后才执行
* 派生类构造方法
* 语法:
* 子类构造方法:base(参数变量名)
* 如果程序运行要执行子类带参的构造方法,那么首先会执行父类的带参构造方法,然后再执行子类的
*
* 五.base关键字显式调用父类构造方法外,还有更大的作用:
* 使用base来访问父类的成员
* this:代表当前类的对象
* base:就是在子类中调用父类的成员时使用
*
* 六.protected访问修饰符:保护的意思,如果使用protected修饰的成员允许被子类访问,其他类不能访问
*
* 七: object 类:
* 在.net中所有的类都派生自一个名为object的类(来自System命名空间),如果类定义时没有指定父类
* 那么编译的时候,编译器会自动设定这个类直接派生自System.object
*
* 八: 密封类:
* 定义密封类需要使用sealed关键字
* 语法:sealed class 类名{}
* 当我们不允许扩展该类时,就可以定义为密封类
* 密封类中的成员不能被protected修饰
*
*
* 子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
问题:子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数,
创建父类对象,让子类可以使用父类中的成员。
所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,
子类就调用不到了,所以子类会报错。
解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
*
*
*/
//定义一个人类
class Person
{
//3构造方法
public Person()
{
Console.WriteLine("我是父类的无参构造方法");
}
//4 有参的构造方法
public Person(int Age,string Name)
{
this.age = Age;
this.name = Name;
Console.WriteLine("我是父类带参数的构造方法");
}
//两个公开的变量,名字和年龄
public int age;
public string name;
//一个说话的方法
public void Speak()
{
Console.WriteLine("你好,我是{0},很开心认识你!", this.name);
}
}
//定义一个学生类Student,Student类继承Person类
class Student : Person
{
//4.添加无参构造方法
public Student()
{
Console.WriteLine("我是无参的子类构造方法");
}
//4.添加有参构造方法
public Student(int StuId,int Age,string Name):base(Age,Name)
{
this.stuId = StuId;
Console.WriteLine("我是子类的有参构造方法");
}
//1.在Student类里没有任何代码,但因为继承了Person类
//1.所以类实际上也是有age和name 两个成员变量,以及Speak()方法
//2新添加成员变量stuId
public int stuId;
//2新添加一个成员方法Study()
public void Study()
{
//5.使用base关键在调用父类成员
base.Speak();
Console.WriteLine("好好学习,天天向上。");
}
}
//写一个密封类
sealed class Circle
{
public int radius;//圆的半径
public double GetInfo()
{
return 2 * Math.PI * radius;
}
}
//class RedCircle : Circle
//{
//}
class Program
{
static void Main(string[] args)
{
//3实例化子类对象,调用子类构造方法,会自定调用父类无参的构造方法
Student stu = new Student();
stu.name = "张三";
stu.age = 19;
//2
stu.stuId = 1001;
stu.Speak();
//2调用Student对象的Study()
stu.Study();
//4.实例化子类对象
Student s = new Student(1002, 18, "李四");
Console.WriteLine(s.stuId);
Console.WriteLine(s.name);
Console.WriteLine(s.age);
Console.ReadKey();
}
}
多态
/*
* 多态:多种形态的意思,重载就是多态的一种,今天讲解多态另一种形式,重写
* 重写需要两个关键字:virtual (虚拟的) 和override(覆盖)
* 重写就是在子类中对父类的方法进行修改或者说在子类中对它进行重写编写
* 使用方法:
* 1.virtual关键字用于将父类的方法定义为虚方法
* 2.在子类中使用override关键字重写父类的虚方法
*/
class Person
{
public int age;
public string name;
public virtual void speak()
{
Console.WriteLine("你好,我是{0},还是学生,很高兴认识你", this.name);
}
}
//Student类继承Person类
class Student : Person
{
}
//Teacher类继承Person类
//如果老师类调用person类的speak方法就会有问题了
//这个时候,我们可以使用重写
class Teacher : Person
{
public int teacherId;
public override void speak()
{
Console.WriteLine("你好,我是{0},是老师,很高兴认识你", this.name);
}
}
class Program
{
static void Main(string[] args)
{
Student s = new Student();
s.name = "张三";
s.speak();
Teacher t = new Teacher();
t.name = "李四";
t.speak();
//父类的对象可以指向子类的对象,反之不成立
Person pt = new Teacher();
pt.name = "王五";
pt.speak();
Console.ReadKey();
}
}
继承练习
class Program
{
static void Main(string[] args)
{
Student s = new Student("学生", 18, '男', 101);
}
}
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 CHLSS()
{
Console.WriteLine("吃喝拉撒睡");
}
public Person(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
//public Person()
//{
//}
}
public class Student : Person
{
public Student(string name, int age, char gender, int id)
: base(name, age, gender)
{
//this.Name = name;
//this.Age = age;
//this.Gender = gender;
this.Id = id;
}
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
public void Study()
{
Console.WriteLine("学生会学习");
}
}
public class Teacher : Person
{
public Teacher(string name, int age, char gender, double 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("老师会讲课");
}
}
public class Driver : Person
{
public Driver(string name, int age, char gender, int driveTime)
: base(name, age, gender)
{
this.DirveTime = driveTime;
}
private int _dirveTime;
public int DirveTime
{
get { return _dirveTime; }
set { _dirveTime = value; }
}
public void Drive()
{
Console.WriteLine("司机会开车");
}
}
网友评论