【C#继承】
本文意在巩固基础知识,所有示例均是博主测试过的,欢迎大家批评指正,如有转载请标明出处,谢谢。
继承、封装和多态是面向对象编程的重要特性。
被继承的类叫基类也称父类,继承其成员的类叫派生类也称子类。
继承的特性:
(1)继承性:子类继承父类除构造函数和析构函数以外的所有成员。
注:子类虽然没有继承父类的构造函数,但实例化子类时会默认的调用父类无参数的构造函数,只有这样子类才能使用父类的属性、方法等。
(2)单根性:一个子类只能有一个父类。
(3)传递性:子类不仅可以继承父类,还可以继承父类的父类以及更高一级的类。
【this】
this的作用:
(1)代表当前类的对象,在类的方法中使用this来调用类的属性,可以以此区分属性与变量(当属性名与变量名一样时)。(2)在类中一个构造函数显示的调用本类的另外一个构造函数,此时使用this可以避免代码的冗余。
举例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
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;
}
}
private char _gender;
public char Gender
{
get
{
return _gender;
}
set
{
_gender = value;
}
}
private int _chinese;
public int Chinese
{
get
{
return _chinese;
}
set
{
_chinese = value;
}
}
private int _math;
public int Math
{
get
{
return _math;
}
set
{
_math = value;
}
}
private int _english;
public int English
{
get
{
return _english;
}
set
{
_english = value;
}
}
public Student(string name, int age, char gender, int chinese, int math, int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
public Student(string name, int age, char gender) : this(name, age, gender, 0, 0, 0)
{
}
}
}
【base】
当在父类中重新写了一个有参数的构造函数后,无参数的构造函数就被干掉了,子类就调用不到了,此时的解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字base
举例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
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;
}
}
private char _gender;
public char Gender
{
get
{
return _gender;
}
set
{
_gender = value;
}
}
private int _chinese;
public int Chinese
{
get
{
return _chinese;
}
set
{
_chinese = value;
}
}
private int _math;
public int Math
{
get
{
return _math;
}
set
{
_math = value;
}
}
private int _english;
public int English
{
get
{
return _english;
}
set
{
_english = value;
}
}
public Student(string name, int age, char gender, int chinese, int math, int english)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
this.English = english;
}
public Student(string name, int age, char gender) : this(name, age, gender, 0, 0, 0)
{
}
}
//子类小学生XiaoXueSheng继承父类Student
public class XiaoXueSheng : Student
{
private int _id;
public int Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
public XiaoXueSheng(string name, int age, char gender,int xueHao) : base(name, age, gender)
{
this.Id = xueHao;
}
}
}
【new】
作用:
(1)创建对象:1)在堆中开辟空间 2)在开辟的空间中创建对象 3)调用对象的构造函数初始化对象
(2)故意隐藏父类的方法:当子类定义的方法名与父类中的方法名同名时,子类的会隐藏掉父类的,从而使子类创建的对象无法调用到父类的方法。
举例:
父类的方法,如下:
public new voidSayHello()
{
Console.WriteLine("我是父类");
}
子类的方法使用new就会隐藏掉父类的SayHello方法
public new void SayHello()
{
Console.WriteLine("我是子类");
}