C#学习笔记(二十)类的继承和类成员访问控制

本文深入探讨了面向对象编程中的核心概念:继承、封装和多态。从继承的特性出发,解释了如何通过继承扩展类的功能,包括单一继承、基类与派生类的关系、构造器的调用顺序以及访问级别的限制。接着讨论了封装的重要性,展示了如何使用访问修饰符控制类成员的访问权限。最后,提到了多态的概念,强调了其在代码扩展性和灵活性中的作用。文章还提供了代码示例来帮助理解这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object是所有类的基类。

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof(Car);
        Type tb = t.BaseType;
        Console.WriteLine(tb.FullName);

        Type tTop = tb.BaseType;
        Console.WriteLine(tTop.FullName);
    }
}

public class Vehicle 
{
}

public class Car:Vehicle
{

}

一个派生类的实例,也是基类的实例。一个子类的实例,也是父类的实例。

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        Console.WriteLine(car is Vehicle);  // True
    }
}

public class Vehicle 
{
}

public class Car:Vehicle
{

}

可以用一个父类类型的变量来引用来一个子类类型的实例。 

class Program
{
    static void Main(string[] args)
    {
        //可以用一个父类类型的变量来引用来一个子类类型的实例。
        Object car = new Car();
        Vehicle car2 = new Vehicle();
    }
}

public class Vehicle 
{
}

public class Car:Vehicle
{

}

1、封闭类:sealed修饰:最后一个类,不允许在派生出新类。

2、一个类,最多有一个基类。一个类最多只有一个父类。但是可以有多个基接口。C++可以有多个基类。

说法:

  • 某个类派生自继承自某个基类。
  • 某个类实现了某个基接口;

3、子类的访问级别,不能超越父类。反过来可以,限制子类的访问级别降低。


继承的本质:

本质:派生类在基类已有的成员基础上,对基类进行的横向和纵向上的拓展。

1、派生类基于基类已有的成员。当继承发生的时候,我们的子类对父类的成员是全员获取的(全部继承)。

2、派生与继承的当中,进行的是扩展:类成员只可能是越来越多,不可能是越来越少。

3、一个类成员一旦被引入到继承链中,他就会一直向下传递。不可能再被移除掉。成员数目不能削减。这是静态语言(又叫强类型语言:编译时变量的数据类型已确定,C++\C#\Java)的特征。(动态语言:运行时才确定数据类型。Python,Javascript等)

横向:类成员在数量上的扩充,

纵向:链式继承派生。重写override。

继承就是子类在完整继承父类成员的情况下,对父类进行的横向与纵向拓展。


 完全继承:

class Program
{
    static void Main(string[] args)
    {
        RaceCar raceCar = new RaceCar();
        raceCar.Owner = "F4";
    }
}

public class Vehicle 
{
    public string Owner { get; set; }
}

public class Car:Vehicle
{

}

public class RaceCar:Car
{

}

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        Console.WriteLine(car.Owner);
    }
}

public class Vehicle 
{
    public string Owner { get; set; }
    public Vehicle()
    {
        this.Owner = "N/A";
    }
}

public class Car:Vehicle
{
    public Car()
    {
        this.Owner = "Car Owner";
    }
}

this指代的是用这个类构建出来的对象它自身。

在代码创建实例执行的时候,继承链上的类。通过断点可以观察知道,先构造执行基类的构造器,然后逐级往下构造。

当我们构造子类对象的时候,父 类构造器也是会被调用的。 


父类的实例构造器,是不能被子类所继承的。

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        Console.WriteLine(car.Owner);
    }
}

public class Vehicle 
{
    public string Owner { get; set; }
    public Vehicle(string owner)
    {
        this.Owner = owner;
    }
}

public class Car:Vehicle
{
    public Car():base("N/A")
    {
        this.Owner = "Car Owner";
    }
}

上例中基类的构造器需要一个string类型的参数,但是子类给不了,为此,需要一个base("N/A")去传递。


封装:访问限制。

public:可以通过引用在项目以外被调用。

internal:默认:仅限于项目内部之间调用。

private:访问限制在类内。类以外不被访问。

protected:访问范围限制在继承链上。只有继承父类的子类(在继承链上)才可以访问。

在写字段的时候,很多人默认在前面加上下划线。表示是一个私有字段。类似python也是如此处置。 


编程语言学习方法的问题:没有调查没有发言权,评价一门语言如何?都学会了,学精了,才有资格来点评。

面向对象的实现风格:

  • Class-based:基于的封装、继承、多态。
  • Prototype-based:基于原型的封装、继承、多态。Javascript。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值