当前位置: 移动技术网 > IT编程>开发语言>.net > C#面向对象思想之继承介绍

C#面向对象思想之继承介绍

2020年08月01日  | 移动技术网IT编程  | 我要评论
C#基础 学习笔记(三)继承一、引言开头先来一段代码吧!using System;namespace cgb{ public class ccc { static void Main(string[] args) { } public class Student { private string _name; public st

一、引言

开头先来一段代码吧!

using System; namespace cgb { public class ccc { static void Main(string[] args) { } public class Student { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public void learn() { Console.WriteLine("学习"); } } public class Teacher { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } set { _age = value; } } public void f1() { Console.WriteLine("继承"); } public void teach() { Console.WriteLine("教书"); } } } } 

把几个类中重复的成员单独拿出来封装成一个类,作为几个类的父类。
student和teacher重复的成员是属性Name,Age和方法f1()。

修改后的代码如下:

using System; namespace cgb { public class ccc { static void Main(string[] args) { } public class Student : Person { public void learn() { Console.WriteLine("学习"); } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } } 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; } } public void f1() { Console.WriteLine("继承"); } } } } 

Student : Person的意思是Student继承于Person。
Student和Teacher是子类,又称派生类;
Person是父类,又称基类。

在这里插入图片描述
图片中,新建一个Student类的实例对象,属性Age、Name和方法f1()都是属于Person类的,可见子类是可以用父类的东西的。

二、继承的特性:单根性

Student : Person (对)
Student : Person,Teacher (错)
一个类只能继承于一个父类。一个人只能有一个亲生父亲。

三、继承的特性:传递性

using System; namespace cgb { public class ccc { static void Main(string[] args) { } public class Student : Teacher { public void learn() { Console.WriteLine("学习"); } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } } 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; } } public void f1() { Console.WriteLine("继承"); } } } } 

在这里插入图片描述
图片中,新建一个Student类的实例对象,属性Age、Name和方法f1()都是属于Person类的,可见Student类还是可以用Person类的东西的。在这里Person类是Student类的爷爷辈了,爷爷的东西是父亲的,父亲的东西是儿子的。

四、子类是否继承父类构造函数?

using System; namespace cgb { public class ccc { static void Main(string[] args) { Student s = new Student(); } public class Student : Person { public void learn() { Console.WriteLine("学习"); } public Student() { } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } } 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; } } public void f1() { Console.WriteLine("继承"); } public Person() { } } } } 

断点调试的执行顺序是先执行public Person() { },再执行public Student() { }。
结论:子类并没有继承父类的构造函数。但是,子类会默认调用父类无参数的构造函数,创建父类对象以后,子类才可以用父类里面的属性和方法。

但是如果父类的构造函数是有参数的,如:

public Person(string name, int age) { this.Name = name; this.Age = age; } 

如果子类的构造函数还是无参数的话,如:public Student() { },就会报错。
简单来说,就是要一一对应。子类的无参数构造函数对应父类的无参数构造函数,子类的有参数构造函数对应父类的有参数构造函数。

解决方案:
1、在父类中重新写一个无参数的构造函数,就不会报错。
代码如下:

using System; namespace cgb { public class ccc { static void Main(string[] args) { Student s = new Student(); } public class Student : Person { public void learn() { Console.WriteLine("学习"); } public Student() { } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } public Teacher() { } } 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; } } public void f1() { Console.WriteLine("继承"); } public Person(string name, int age) { this.Name = name; this.Age = age; } public Person() { } } } } 

2、在子类中显示的调用父类的构造函数,使用关键字:base()。

using System; namespace cgb { public class ccc { static void Main(string[] args) { Student s = new Student("cgb",22); } public class Student : Person { public void learn() { Console.WriteLine("学习"); } public Student(string name,int age):base(name,age) { } } public class Teacher : Person { public void teach() { Console.WriteLine("教书"); } public Teacher(string name, int age) : base(name, age) { } } 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; } } public void f1() { Console.WriteLine("继承"); } public Person(string name, int age) { this.Name = name; this.Age = age; } } } } 

本文地址:https://blog.csdn.net/qq_44978355/article/details/108259032

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网