.Net Framework 4/C# 面向对象编程进阶

发布于:2025-06-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、继承

(一)使用继承

        子类可以继承父类原有的属性和方法,也可以增加原来父类不具备的属性和方法,或者直接重写父类中的某些方法。

        C# 中使用“:”来表示两个类的继承。子类不能访问父类的私有成员,但是可以访问其公有成员,即只要使用 public 声明类成员,就既可以让一个类成员被父类和子类同时访问,也可以被外部的代码访问。

        另外,为了解决父类成员的访问问题,C# 还提供了另外一种访问修饰符:protected,它表示受保护成员,只有父类和子类才能访问 protected 成员,外部代码不能访问。

        子类不能继承父类中定义的 private 成员。

        需要注意以下几点:

  1. C# 只支持类的单继承,而不支持类的多重继承,即在 C# 中一次只允许继承一个类,不能同时继承多个类;
  2. 在实现类的继承时,子类的可访问行必须要低于或者等于父类的可访问性,例如父类采用默认的访问权限:private 时,子类在继承的时候,不能采用 public 的访问权限,因为 public 的访问权限高于 private 的访问权限。

(二) base 关键字

        如果子类重写了父类的方法,并且想在子类的方法中调用父类原有的方法,C# 提供了 base 关键字。

        base 关键字的使用方法与 this 关键字的使用方法类似,this 关键字代表本类对象,base 关键字代表父类对象,使用方法如下:

base.property;		//调用父类的属性
base.method();		//调用父类的方法

        如果要在子类中使用 base 关键字调用父类的属性或者方法,则父类的属性和方法的可访问性必须定义为 public 或者 protecte,而不能是 private。

        另外,使用 base 关键字还可以指定创建子类对象时应调用的父类构造函数。例如有:

public Computer(string name, string num)
{
    name = name;
    num = num;
}

public Pad(string model, string name, string num):base(name, num)
{
    model = model;
}

        在静态方法中使用 base 关键字是错误的。

(三)继承中的构造函数与析构函数

        在进行类的继承时,子类的构造函数会隐式地调用父类的无参构造函数,而且先调用父类的构造函数,再调用子类的构造函数,析构函数的调用与构造函数相反。

        需要注意的是,如果父类提供了有参构造函数,在被子类继承时,需要提供无参默认构造函数,这是因为当父类提供有参构造函数时,不会自动提供无参构造函数。

        通过 base 关键字,还可以在子类中调用父类的有参构造函数,此时,父类中就可以不用提供无参构造函数,例如有:

public class Father
{
    public Father(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
}

public class Son : Father
{
    public Son(string name, int age, char gender) : base(name, age)
    {
        this.gender = gender;
    }
}

(四)object 类

        在 C# 中,所有的类都直接或间接的继承自了 object 类,object 类是所有类的基类。

(五)关键字 new 隐藏父类成员

        当子类和父类在声明成员时,如果子类和父类的成员名相同,则会隐藏掉父类的成员方法,子类对象无法调用父类的成员,这时,程序会报警告。因此,可以在子类定义同名成员时,在访问修饰符后面加上 new 关键字,此时就可以完全隐藏掉父类的同名成员。

(六)sealed 修饰符

        继承类时,需要使用冒号加类名,当对一个类应用 sealed 修饰符时(也就是密封类),该修饰符会阻止其他类从该类继承。

(七)里氏转换*

        里氏转换主要有两个作用:

  1. 子类可以赋值给父类,也就是说,如果有一个地方需要一个父类作为参数,我们可以给一个子类代替;
  2. 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。

        例如有:

public class Father
{
    public void text01()
    {
        
    }
}

public class Son : Father
{
    public void text02()
    {

网站公告

今日签到

点亮在社区的每一天
去签到