目录
1.base关键字
base关键字用于在派生类中访问基类的成员。具体来说,它有两个主要用途:
- 调用基类中被子类重写(override)的方法。
- 在派生类的构造函数中调用基类的构造函数(指定调用哪个基类构造函数)。
1.1举例
1.1.1调用基类中被重写的方法
假设我们有一个基类 Person,它有一个方法 GetInfo,该方法被标记为 virtual,意味着它可以被派生类重写。
然后,我们有一个派生类 Employee,它重写了 GetInfo方法。但在重写的方法中,我们还想调用基类的 GetInfo方法,这时就可以使用 base.GetInfo()。
Employee E = new Employee();
E.GetInfo();
public class Person
{
protected string ssn = "20251128";
protected string name = "bo luo";
public virtual void GetInfo()
{
Console.WriteLine($"Name: {name}");
Console.WriteLine($"SSN: {ssn}");
}
}
class Employee : Person
{
public readonly string id = "ABCDEFG";
public override void GetInfo()
{
// 调用基类的GetInfo方法
base.GetInfo();
// 然后输出派生类特有的信息
Console.WriteLine($"Employee ID: {id}");
}
}
输出:
Name: bo luo
SSN: 20251128
Employee ID: ABCDEFG
1.1.2调用基类的构造函数
在继承中,当我们创建派生类的实例时,会先调用基类的构造函数,然后再调用派生类的构造函数。如果我们想指定调用基类的哪个构造函数(因为基类可能有多个构造函数),就可以使用 base关键字。
public class BaseClass
{
private int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum()
{
return num;
}
}
public class DerivedClass : BaseClass
{
// 这个构造函数会调用基类的无参构造函数 BaseClass()
public DerivedClass() : base()
{
}
// 这个构造函数会调用基类的有参构造函数 BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
static void Main()
{
DerivedClass md = new DerivedClass(); // 调用基类的无参构造函数
DerivedClass md1 = new DerivedClass(1); // 调用基类的有参构造函数
}
}
输出:
in BaseClass()
in BaseClass(int i)
1.2注意事项
- 使用 base关键字只能访问基类中非私有的成员(即 public、protected或 internal等可访问的成员)。
- 在静态方法中不能使用 base关键字,因为静态方法不依赖于实例,而 base是针对实例的。
- 当基类没有无参构造函数时必须使用 base,有无参构造函数时可以省略
public class BaseClass { public string Name; // 只有有参构造函数,没有无参构造函数 public BaseClass(string name) { Name= name; } } public class DerivedClass : BaseClass { public DerivedClass(string name) : base(name) // 必须用base指定 { // 如果不写 : base(name),会报错! } }
1.3总结
-
base.方法名()= "调用基类的这个方法" -
: base(参数)= "创建派生类时,先这样创建基类"
base关键字在继承中非常有用,它允许我们重用基类的代码,并在其基础上进行扩展。通过 base,我们可以调用基类的方法和构造函数,从而避免重复代码,并确保基类的初始化逻辑得到执行。
2.this关键字
this关键字主要用途:
- 引用当前类的实例(在实例方法或构造函数中)。
2.1使用this的情况
2.1.1限定类似名称隐藏的成员
当方法的参数或局部变量与类的字段(成员变量)同名时,使用this可以明确指定要访问的是类的字段,而不是参数或局部变量。
例如,在Cat类的构造函数中,参数name和age与类的字段name和age同名。为了区分,使用this.name表示当前对象的name字段,而name表示参数。
public class Cat
{
private string name; // 字段
private string age; // 字段
// 构造函数,参数与字段同名
public Cat(string name, string age)
{
// 使用this来区分字段和参数
this.name = name; // 将参数name赋值给当前对象的name字段
this.age= age; // 将参数age赋值给当前对象的age字段
}
}
如果不使用this,在构造函数中写name = name,那么实际上只是参数自己赋值给自己,字段的值并没有被修改。使用this可以明确指定左边的name是当前对象的字段。
2.1.2将对象作为参数传递给其他方法
在类的方法中,可以使用this将当前对象传递给另一个方法。
例如,在下面的例子中
this 代表当前正在执行方法的那个Cat对象(即cat变量指向的对象)
传递this 就是把整个猫咪对象传给RegistrationSystem使用
RegistrationSystem接收到的是完整的对象引用,可以访问对象的所有属性和方法
Cat cat= new Cat("冻干", "纯净水");
cat.PrintAccountInfo();
public class Cat
{
public string food { get; set; }
public string water { get; set; }
public Cat(string foodNumber, string waterNumber)
{
food = foodNumber;
water = waterNumber;
}
// 打印小猫食物信息的方法
public void PrintAccountInfo()
{
Console.WriteLine($"食物: {food}, 水: {water}");
// 把当前对象传给登记系统进行记录
RegistrationSystem.RecordTransaction(this);// 传递整个猫咪对象
}
}
// 登记系统类
public static class RegistrationSystem
{
public static void RecordTransaction(Cat cat)
{
Console.WriteLine($"[查询记录] 食物: {cat.food} ,水: {cat.water}");
}
}
2.1.3声明索引器
索引器允许对象像数组一样被索引。在声明索引器时,使用this关键字来定义索引器。
例如,我们有一个类,内部封装了一个数组,this[int index]定义了一个索引器,它允许我们使用数组语法来访问MyCollection对象的元素。
MyCollection coll = new MyCollection();
coll[0] = 1; // 调用索引器的set访问器
Console.WriteLine(coll[0]); // 调用索引器的get访问器,输出1
public class MyCollection
{
private int[] array = new int[100];
// 索引器
public int this[int index]
{
get
{
return array[index];
}
set
{
array[index] = value;
}
}
}
2.2重要提醒
-
静态方法中不能用
this(因为静态方法不属于具体对象) -
大部分情况下,
this可以省略,但当名字冲突时必须使用
2.3简单理解
把 this想象成"我"或"这个"。在代码中,它总是指"当前正在执行方法的那个对象"。
学到了这里,咱俩真棒,记得按时吃饭(最近好困,每天就是喝着美式,说没事!)
【本篇结束,新的知识会不定时补充】
感谢你的阅读!如果内容有帮助,欢迎 点赞❤️ + 收藏⭐ + 关注 支持! 😊
482

被折叠的 条评论
为什么被折叠?



