欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-11 16:11:46
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是父类,又称基类。

C#面向对象思想之继承介绍
图片中,新建一个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("继承"); } } } } 

C#面向对象思想之继承介绍
图片中,新建一个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