OOP之多态 【C#】

Ansys Workbench齿轮接触强度分析:从建模到收敛的完整流程 有限元分析是解决复杂工程接触问题的核心技术,其原理在于通过数值离散方法求解连续介质力学方程,能够处理非线性接触、材料弹塑性和复杂几何边界。在齿轮传动设计中,接触强度直接决定齿面疲劳寿命与可靠性,而Ansys Workbench作为集成化仿真平台,为齿轮接触分析提供了从几何处理、接触对设置到网格划分的完整解决方案。实际工程中,接触刚度、网格匹配性和载荷步策略是影响计算收敛与结果精度的关键因素。本文围绕齿轮接触强度分析,系统梳理了Workbench环境下的建模流程、参数设置与常见问题排查方法,帮助工程师避开典型 阅读详情
======================================================
其实这篇文章是我整理出来的一篇讲稿,关于C#的资料中多态的描述很匮乏,
包括别的语言[Java,C++]也是。我是Delphi程序员出身的,很庆幸关于多态的论述在Delphi的
著作中有很多,所以我是参考Delphi资料,再加上自己对C#的理解整理的,纰漏之处,请见谅!
    参考资料
【参透Delphi/Kylix】作者:乔林
【Delphi面相对象编程思想】作者:刘艺
【Delphi高手突破】 作者:申旻




 
======================================================

                多态
,面向对象编程的核心概念。
                请相信:无论怎样强调多态在OOP中的重要性,都不为过。
                不理解它,也就不会真正明白什么是OOP。

一、静态方法与类型适应

        A、方法的分类: 

            所谓联编是指编译器在什么时候确定调用那段程序代码,如果对某段程序代码的调用能够在编译时确定,则称为静态联编或先期联编;否则称为动态联编或滞后联编;
            按照类的编译方式,方法可分为
实例方法;虚拟方法;抽象方法等,这些特性可以实现对象的多态性。

        B、实例方法

           
如果在类的声明中,在方法后不使用virtual或abstract等方法指示符,则该方法就是实例方法。这表明,我们在类中声明的方法缺省为
实例方法。
            在调用
实例方法时,方法名前的对象类型唯一确定调用的是哪个方法。

       C、类型适应 【定义】
          
           
类的继承关系是按照层次结构组织的。面向对象的理论规定,祖先类兼容它所有的后代类,而后代类则不兼容于它的祖先类型。               
            因此我们可以:
    FatherClass Fclass1, Fclass2;                 
    Fclass11 
= new FatherClass();
    Fclass12 
= new SunClass();

           
这种类型之间的兼容性称为类型适应。
            但不可以:
            
SunClass Sclass;   SunClass = new FatherClass();    //error

       D、类型适应 【应用】
           
            在程序中我们我们可以大量的见到如下的代码:
           
private void button1_Click(object sender, EventArgs e);

           
那么sender参数是什么?它是对object对象的引用。我们在程序中有这样的object对象实例嘛?没有!程序中使用的所有对象都是object对象的继承类类型,而不是object类型本身。如果不允许类型适应,则必须为所有的继承类型都重载一遍如下方法:
           
private void button1_Click(button sender, EventArgs e);
private void checkBox1_CheckedChanged(checkBox sender, EventArgs e);

           
这样书写很不方便,而且如果我们声明了一个新的类型该怎么办呢?该方法必须在C#中实现并且在编译前予以解释,在编译前如何知道我们声明了新类呢?所以,允许子类向父类任意赋值就是最自然的选择,参数实际传递的是对子对象对象实例的引用。

二、虚拟方法
        A、强制类型转换的缺陷

           
如前所述:我们可以
               
FatherClass  Fclass = new SunClass();

            但却只能访问父类类型定义的方法或数据域,而在很多时候我们需要访问子类的方法或数据域,该如何呢?
            通过强制类型转换总是可以的,但如此操作对类类型很不安全,很可能将它转换为一个错误的类型,我们总知道应该将其转换为什么类型,但问题是,编译器知道嘛?
            比如类库中有方法  Work(FatherClass  Fc);
            实际使用时候需要传入FatherClass的子类,比如SunClass, SunClass1等等,我们根据需要从FatherClass派生了新的子类NewSunClass,并重新实现了FatherClass类中方法比如TestFunc(),那么如何在Work(FatherClass  Fc);中调用到NewSunClass. TestFunc(); 呢?
            就我们讲过的知识,我们没有任何办法!!

        B、虚拟方法

            实际解决的方法就是使用virtual关键字将父类中的TestFunc()声明为虚拟的,这样在调用虚拟方法时,即使将变量转换为父类类型,只要它实际引用的是子类类型的对象实例,调用的都将是子类的方法。需要注意的是子类中TestFunc()方法需用override 修饰,这个叫覆盖。
            演示代码如下:
        
public class FatherClass
{
   
public virtual void TestFunc()
    
{
         MessageBox.Show(
"FatherClass TestFunc ");  
     }
}

public class SunClass : FatherClass
{ 
   
public override void TestFunc()
 
  {
       MessageBox.Show(
"SunClass TestFunc ");  
    }

}

           
使用如下:
           
FatherClass Fclass = NewSunClass();
Fclass.TestFunc();

            在编译如上代码时候,编译器对于指向那个TestFunc()方法是不知道的,只有根据对象实例本身的类类型在程序运行过程中动态确定,这也就是滞后联编的意思所在。
            也就是说父类和子类具有相似性,我们常说“有其父必有其子”,在面向对象领域中,这句话是不对的,它应为“有其子必有其父”。
            父亲的行为象儿子,而不是儿子的行为象父亲,这是理解多态性的关键。

三、方法指示符
    A、方法的重定义

           
先给出一段代码示例:  
         
public class FatherClass
{
     
public void TestViMethod()
 
   {  
                MessageBox.Show(
"FatherClass TestMethod"); 
           }


        
public void TestaBMethod()
        
{  
                 MessageBox.Show(
"FatherClass TestMethod"); 
            }

}


     public abstract class SunClass : FatherClass
{
        
public virtual new void TestViMethod()
        
{  
                 MessageBox.Show(
"SunClass TestMethod");   
             }

        
public abstract new void TestaBMethod();
  }

           
没有错,在C#中,如上代码完全可以运行!
在方法重定义的场合,在子类中同时存在着自己和父类的重定义函数,只是由于可见性的关系,父类的函数不可见而已。
            刚才我们演示的重定义的方法中,既有重定义为虚拟方法也有重定义为抽象方法的【其实抽象方法是隐式的虚拟方法】,没错,这个完全可以,如果要在子类的后代中对该方法进行覆盖,则必须将它定义为虚拟方法或动态方法。
            重定义和覆盖构成了类层次中定义同名静态方法的两种手段。但是在编码中,重定义不建议使用,知道就可以了。

        B、方法的覆盖

           
这里需要对覆盖指出几点:
            其一:所谓覆盖指的是对父类中同名函数的覆盖,所以子类中的方法申明必须与父类完全相同。
            其二:不能覆盖父类中不存在的方法。
            其三:只能覆盖父类中的虚拟方法【抽象方法是隐式虚拟方法】
            其四:如果在子类中覆盖了父类的方法,则应在子类中重新实现它。

四、动态联编机制       
        A、概念
       
   

            将特定的属性与程序代码的特定单元关联起来的过程称为联编;如果联编出现在程序运行前,则为静态联编;如果联编出现在程序运行时,则为动态联编。
            由静态联编所确定的关联一旦建立,就不会再改变;二有动态联编所确定的关联可以改变或被其他关联所取代。

        B、C#中的动态联编
           
           
C#中的动态联编使用虚拟方法或者抽象方法来实现。我们将类中的一些方法声明为虚拟或者抽象的,就意味着这些方法在子类中会有不同的实现,编译器为虚拟方法和抽象方法调用生成调用代码,这些代码在运行时能按照对象实例本身的类类型动态选择所定义的虚拟或者抽象方法。
            动态联编与继承机制使我们可以在一个高水平的抽象层次上使用继承层次结构。我们仅需在该层次结构的顶层从事有效的工作,而不必关心底层子类的存在。这对于程序设计与实现都是非常有益的。

五、进入主题:多态性
        A、多态的定义

           
封装可以隐藏实现细节,使得代码模块化,继承可以扩展已存在的代码模块,它们的目的都是为了代码重用,而多态则是为了实现另外一个目的:接口重用。
            Bruce Eckel说:“不要犯傻,如果它不是晚绑定,它就不是多态!” 【 <Thinking in Java> 作者 】
            那么该如何理解多态呢?
            虚拟方法是类中声明的非静态方法,在类中该方法声明带有virtual或者abstract,我们称带有虚拟方法的类成为多态类。
            在后面的讨论中,我们将会看到,多态类提供了相同的操作接口,但能服务于不同的应用要求。当基于父类抽象设计程序,而所设计的程序又需要适应子类操作变化时,就需要使用虚拟方法通知编译器这种可能的变化,使编译器为虚拟方法调用生成特别代码,以便运行时对虚拟方法调用采用动态联编。
            基于此,我们说虚拟方法与覆盖的实现就是多态。
            所以我们说,实现了如下多态三大要素,也就实现了多态:
                第一:在父类中定义虚拟方法。
                第二:在子类中覆盖父类中的虚拟方法。
                第三:申明父类实例的变量,则该变量既可以指向父类的实例,也可以指向子类的实例。当变量指向父类实例时,调用的是父类方法;当变量指向子类实例时,调用的是子类同名方法。

        B、多态的实例

       
   
SayHello_1
                Form1启动 --没有使用多态
                Form2启动 --使用多态  [ 有什么好处呢?]
                Form3启动 --重构多态  [ 继续重构 ]
                Form4启动 -- 简单工厂模式

        C、警惕多态
           
           
当在子类覆盖父类的虚拟方法时候,有如下注意事项:
            第一:在很多程序语言中,子类override父类的方法以后,子类的可见性可以不低于原先声明,但是C#可见性必须和父类相同
            第二:子类override父类的虚拟方法,方法申明必须完全一致
            第三:动态联编的类的this不确定,它或者指向父类或者指向子类,其具体在动态联编时确定,使用时候需要注意

六、抽象方法与抽象类
            A、抽象方法注意事项
               
               
包含有抽象方法声明的类叫做抽象类
                第一:在调用抽象方法时候,不能引用父类类型对象实例的该方法。【也即抽象类不能实例化】
                第二:如果子类没有覆盖父类的抽象方法,则子类继承来的该方法仍然为抽象方法,同样的抽象子类也不能实例化

            B、抽象类
               
               
刚才提到了包含有抽象方法声明的类叫做抽象类。
                抽象类不能实例化;
                抽象类可以包含有非抽象方法
                设计好的抽象类定义了子类所应该遵循的一组协议,
                因此,抽象类反映了子类的共同行为,从而可以传达设计意图。

七、题外话:多态的重要性

            在OO的程序设计和开发中,多态是道坎,只有在开发或者设计中,能够灵活的使用多态,你才会体会到OO中的乐趣。
            设计模式是OO的另外一道坎,很多人在学习设计模式时候,感到很吃力,其实也是没有吃透多态的缘故。
            设计模式中处处潜藏着多态的身影,可以毫不夸张的说,存在类泛化【类继承】的模式中,一定有多态的存在,而大多模式都存在类继承,也自然存在着多态在设计模式中的使用,足见多态的重要。
            上升到共同类库,
应用框架的开发,又是以设计模式为基础的,多态的重要性可见一斑。

八、结束
                            谢谢!


 
oop 事件 委托 多态 继承 对oop 事件 委托 多态 继承作了比较简洁详尽的说明和介绍,希望能对你有帮助。 立即下载

相关推荐

Ubuntu 22.04 LTS升级OpenSSH 9.6p1完整指南(附OpenSSL 3.2.0适配方案)

本文详细介绍了在Ubuntu 22.04 LTS系统中升级OpenSSH至9.6p1版本的全流程,包括OpenSSL 3.2.0的适配方案。从准备工作、依赖库安装、源代码编译到系统集成与配置,提供了完整的操作指南和常见问题解决方法,帮助用户安全高效地完成升级,提升服务器安全性和性能。

i8j9k0l1的博客 320

C#设计模式(23种设计模式)

创建型:         1. 单件模式(Singleton Pattern)          2. 抽象工厂(Abstract Factory)          3. 建造者模式(Builder)          4. 工厂方法模式(Factory Method)          5. 原型模式(Prototype) 结构型:         6. 适配器模式(Adapt...

weixin_33872660的博客 343

IMU卡尔曼滤波方法详细介绍

本文介绍了基于IMU和卡尔曼滤波的状态估计方法。系统采用9维状态向量(位置、速度、加速度计零偏),通过牛顿运动学建立状态方程,并利用外部位置观测进行校正。详细推导了状态转移矩阵和控制输入矩阵的形式,阐述了预测和更新的计算步骤。同时说明了过程噪声Q和观测噪声R的设置原则,其中Q反映模型不确定性,R取决于传感器精度。该方法可有效融合IMU测量与外部观测数据,实现位置、速度和偏置的联合估计。

haing2019的博客 758

C#开发模式

模式分为三种,设计模式、体系结构模式与惯用法。 其中惯用法是一种语言紧密相关的模式, 例如:定界加锁模式其实是一种惯用法。在C#项目开发过程中,很多情况下您已经使用了某些模式,但或许您并不知道自己所使用的这种解决方案是一种已经被总结归纳的模式。工厂、策略、桥接、模板方法、代理等等23种Gof经典模式是属于设计模式,设计模式的粒度相对较小,基本上用于提高模块内部的可扩展性和可维护性需求 三层、M

【Erica W】有问题,就问神奇海螺吧! 1051

移远EC20模块USB模式切换的底层逻辑与驱动适配探秘

本文深入探讨了移远EC20模块USB模式切换的底层逻辑与驱动适配机制,详细解析了AT命令控制下的USB0与WWAN0模式差异。通过分析USB协议栈、内核驱动框架及网络子系统的交互,提供了模式切换的完整操作流程和常见问题解决方案,助力开发者优化4G通信模块在嵌入式设备中的稳定连接。

cc789的博客 846

高通camx架构学习(零)—— 深入理解Camera 硬件抽象层

从上面的定义可以看出,主要是通过hw_module_t 代表了模块,通过其open方法用来打开一个设备,而该设备是用hw_device_t来表示,其中除了用来关闭设备的close方法外,并无其它方法,由此可见谷歌定义的HAL接口,并不能满足绝大部分HAL模块的需要,所以谷歌想出了一个比较好的解决方式,那便是将这两个基本结构嵌入到更大的结构体内部,同时在更大的结构内部定义了各自模块特有的方法,用于实现模块的功能,这样,一来对上保持了HAL的统一规范,二来也扩展了模块的功能。

图像学习之旅 1670

OOP 三大特征之多态(Polymorphism)

OOP三大特性最重要的:多态。 很多程序员虽然在用支持OOP的语言,但却从未用过多态。 只使用封装、继承的编程方式,称为基于对象(Object Based)编程 只有加入多态,才能称为OOP 没写过多态,就是没写过OO代码。 正是有了多态,软件设计才有更大弹性,更好拥抱变化。 如何理解多态? 多态,即一个接口,多种形态。 一个draw方法,以正方形调用,则画正方形;以圆形调用,则画圆形: 继承的两种方式之一的实现继承,请尽可能用组合替代。而接口继承,主要是给多态用的。 因为重点在于继承体系的使用者,主

JavaEdge全是干货的技术号 3598

变焦跟踪理论基础(如何在变焦过程中保持清晰)

如何在整个变焦过程中一直保持图像的清晰度或焦点是变焦跟踪的主要挑战。 当用户在缩放跟踪的情况下改变缩放时,设备保持对焦。 然而,在没有变焦跟踪的情况下,图像变得失焦,图像在变焦跟踪后由于自动对焦(AF)算法才最终对焦。...................................................

ChenYX的博客 20万+

面向对象编程(oop)三大特征之三:多态

提高代码的复用性和代码维护性

well_KD的博客 1464

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

RedCap:一种通信技术的概述

总结起来,RedCap是一种基于数据包交换的通信技术,它提供了一种高效、可靠的数据传输机制。通过使用RedCap,我们可以轻松地发送和接收数据包,并确保数据的完整性和正确性。在上面的示例中,我们首先导入了RedCap库,并创建了一个RedCap实例。然后,我们定义了目标地址和源地址,并创建了一个数据包,其中包含了目标地址、源地址和要发送的数据。本文将介绍RedCap的基本原理和使用方法,并提供一些相关的源代码示例。RedCap还提供了其他一些功能,如数据包的重传机制、流量控制和拥塞控制等。

YgjWeb的博客 900

【OOP】多 态

学习目录一.多态的定义二.多态的作用三.多态的体现四.多态使用细节1.向上转型2.向下转型五.动态绑定机制六.多态数组 在没有接触多态以前,我们在主函数调用方法和属性时,一般是通过对象实例化相应的类来实现的,这十分复杂繁琐,特别是在以后如果遇到一个父类的子类非常的多,那工程量就十分的庞大!因此多态的作用与地位就显得十分的重要。 一.多态的定义 “一个接口,多种实现”——多态是一种性质 方法或对象具有多种形态。多态(polymorphism)指为不同数据类型的实体提供统一的接口。多态允许将子类的对象当作父类的

懒羊羊的博客 1261

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 240

C#——OOP封装,继承,多态(20181121)

 &gt;&gt;   A.  &gt;&gt; 类类型   B.  &gt;&gt; 类类型   1.  &gt;&gt;   C.  &gt;&gt; this关键字的作用   D.  &gt;&gt; this,构造函数链   A.  &gt;&gt; static关键字   B.  &amp

SeafyLiang的博客 322

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OOP_多态(C#)

OOP_多态(C#) 一个评选优秀教师和学生的程序,其类结构如图1所示。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出。 code: namespace DuoTaiGoodStuTeach { public class Base { public int num; protected string name; pub...

Code66_3444124800的博客 586

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C#】OOP之多态那点事

前言: 对菜鸟开发者的忠告:花一万个小时练习 Coding,不要浪费一万小时无谓地 Debugging(也就说看代码) 看上面的UML图,我们创建一个抽象的Instrument类,类中有一个抽象方法paly,然后所有的子类都继承这个类并实现paly方法。(若不懂继承,请参照另一篇:OOP之继承那点事) 我们来看一下类的实现: ...

weixin_33790053的博客 226

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# OOP模型(传说中的继承封装多态)

继承 封装 多态

梁州小栗的博客 487

三周C#总结7oop--多态

例子:1.使用类String类的分割split 将字符串  “Solutions to selected exercises can be found in the electronic document The Thinking in C# Annotated Solution Guide, available for a small fee from BruceEckel” 单词提取输出。单词

lhj1101049257的专栏 930

深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)

在本系列中,我们以CodeProject上比较火的OOP系列博客为主,进行OOP深入浅出展现。 无论作为软件设计的高手、或者菜鸟,对于架构设计而言,均需要多次重构、取舍,以有利于整个软件项目的健康构建,有些经验是前辈总结的,我们拿来使用即可,有些是团队知识沉淀的,总之复用前人好的思想有利于减少返工。当然,在面试的时候,如果能围绕OOP大谈特谈,自然会加分多多的。 开始阅读本系列博客的...

245

C# OOP 从零到精通:类、对象、继承与多态的深度解析

面向对象编程(OOP)是C#的核心范式,通过类、对象、继承和多态构建模块化、可扩展的代码体系。以下从基础到高级逐步解析:类是对象的蓝图,定义属性和行为;对象是类的实例化实体。 关键点:子类继承父类特性,扩展新功能。C#使用符号表示继承。 核心规则:多态分为静态(编译时)和动态(运行时): 1. 静态多态(重载) 同一方法名,不同参数列表: 2. 动态多态(重写 + 接口) 通过继承实现运行时绑定: 3. 接口多态 接口定义契约,类实现具体行为:

jsdhxfsdss的博客 408

[C#]面向对象编程概念介绍(OOP)

OOP代表面向对象编程。面向过程编程是编写对数据执行操作的过程或方法,而面向对象的编程是创建包含数据和方法的对象。面向对象的程序设计比面向过程程序设计具有以下优点:1) 结构清晰,程序是模块化和结构化,更加符合人类的思维方式;2) 易扩展,代码重用率高,可继承,可覆盖,可以设计出低耦合的系统;3) 易维护,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活,更易于维护,系统低耦合的特点有利于减少程序的后期维护工作量。

FL1768317420的博客 617

C# 之面向对象编程(OOP)详解

C#面向对象编程(OOP)详解摘要:本文系统讲解了C#中面向对象编程的核心概念,包括类与对象、构造函数、继承多态、访问修饰符等基础内容,以及静态类、密封类、扩展方法等高级特性。重点阐述了OOP四大原则(封装、继承、多态和抽象)的实现方式,并介绍了SRP、OCP、LSP等设计原则。文章还提供了包括封装字段、组合优于继承、依赖注入等多项最佳实践建议,帮助开发者构建结构良好、易于维护的C#应用程序。

weixin_45590420的博客 1088

用C# 实现 OOP,AOP,封装、继承、多态以及方法名称后面跟着 where 关键字的用法,这其实是泛型约束(Generic Constraints) 的核心语法,用来限制泛型类型参数的范围。

本文系统介绍了面向对象编程(OOP)的三大核心特性:封装通过私有字段和公共属性保护数据安全;继承实现代码复用;多态允许子类重写父类方法。同时详细讲解了面向切面编程(AOP)的概念,它通过切面特性(如日志、性能监控)与核心业务逻辑解耦,演示了基于特性+反射的AOP实现方式,并与工业级AOP框架进行对比。文章通过交通工具的完整示例,展示了OOP三大特性与AOP的结合应用,最后还补充了泛型约束、设计模式等进阶内容,为开发者提供了全面的编程范式指导。

cao919的专栏Net 645

【Java编程教程】详解Java OOP 概念

隐藏内部细节和显示功能被称为抽象。比如电话,我们不知道内部处理。在Java中,我们使用抽象类和接口来实现抽象。

架构师小吴的博客 425
上一篇: 【转】用正确方法写出质量好的软件的75条体会
下一篇: 应用框架开发入门
SysBug
博客等级 码龄22年 3粉丝 14原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值