继承和多态

简介:

sealed关键字

如果我们将类标记为sealed,编译器将不会允许我们从这个类型派生。(C#结构总是隐式密封的。因此,我们永远不可以从结构继承结构,从类继承结构或从结构继承类。结构只能用于建模独立的、用户定义的数据类型。如果希望是is-a关系,就必须使用类。)


使用base关键字控制基类的创建


protected关键字

派生类型不再需要使用公共方法或属性来间接访问数据了。当然,可能的坏处在于:如果派生类型有权直接访问其父类内部数据,有可能会偶尔绕过公共属性内设置的既有业务规则。当定义受保护成员时,也就创建了一种父类和子类之间的信任级别,编译器不会捕获任何违背类型业务规则的异常。


包含/委托编程

class BenefitPackage

{

   public  double  ComputePayDeduction()

   {  return 125.0;  }

}

partial class Employee

{

    protected BenefitPackage  empBenefits=new BenefitPackage();

    public double GetBenefitCost()

    {   return empBenefits.ComputePayDeduction();  }

    public BenefitPackage Benefits

    {   get { return empBenefits;  }

        set { empBenefits=value;  }

    }

    .......

}


嵌套类型

public class OuterClass

{

     //公共嵌套类型可以被任何人使用

     public class PublicInnerClass { }

     //私有嵌套类型只可以被包含类的成员使用

     public class PrivateInnerClass { }

}

嵌套类型的特征:

通过嵌套类型可以完全控制内部类型的访问级别,也就是可以声明为私有的(回忆一下,非嵌套类不能使用private关键字来声明)。

由于嵌套类型是包含类的成员,所以它可以访问包含类的私有成员。

通常,嵌套类型只用做外部类的辅助方法,而不是外部世界所准备的。

//Employee嵌套BenefitPackage

public partial class Employee

{

    // BenefitPackage嵌套BenefitPackageLevel

    public class BenefitPackage

    {

        public enum BenefitPackageLevel

        {   Standard,Gold,Platinum  }

     }

     public double ComputePayDeduction()

     {  return 125.0  }

}

在这种嵌套关系里需要注意如何使用枚举:

Employee.BenefitPackage.BenefitPackageLevel myBenefitLevel=Employee.BenefitPackage.BenefitPackageLevel.Platinum;


virtual和override关键字

多态为子类提供了一种方式,使其可以定义为由其基类定义的方法,这种过程叫做方法重写。

partial class Employee

{

     poblic virtual void GiveBonus(float amount)

     {  Pay+=amount ; }

......

}

用virtual关键字标记的方法成为虚方法。

如果子类希望改变虚方法的实现细节,就必须使用override关键字。

class SalesPerson:Employee

{ .......

//销售人员的奖金受销量的影响

     public override void GiveBonus(float amount)

     {

            int salesBonus=0;

            if(numberOfSales>=0&&numberOfSales<=100)

                  salesBonus=10;

            else

             {  if(numberOfSales>=101&&numberOfSales<=200)

                    salesBonus=15;

                else

                    salesBonus=20;

             }

             base.GiveBonus(amount*salesBonus);

      }

}

class Manager:Employee

{ .......

     public override void GiveBonus(float amout)

     {    base.GiveBonus(amount);

           Random r=new Random();

           numberOfOptions+=r.Next(500);

     }

}


密封虚成员

class SalesPerson:Employee

{  ........

   public override sealed void GiveBonus(float amount)

   {  .......  }

}

sealed class PTSalesPerson:SalesPerson

{ .......

     public PTSalesPerson(string fullName,int age,int empID,float currPay,string ssn,int numbOfSales)

          :base(fullName,age,empID,currPay,ssn,numbOfSales)

           {  }

     // 编译器错误!不能在PTSalesPerson类中重写这个方法,因为它是被密封的

     public override void GiveBonus(float amount)

     {   }

}


抽象类

由于很多基类都是比较模糊的尸体,好的设计师会防止在代码中直接创建新的Employee对象。

abstract partial class Employee

{   ........  }


构建多态接口

成员投影

基类/派生类的转换规则


as关键字

//我们不能强制转换frank为Hexagon,但编译没问题

Hexagon hex=(Hexagon)frank;

//使用“as”来测试兼容性

Hexagon hex2=frank as Hexagon;

if(hex2==null)

     Console.WriteLine("Sorry,frank is not a Hexagon...");


is关键字

除了is关键字,C#语言还提供了is关键字来测试两个项是否兼容。然而,和as关键字不同的是,如果类型不兼容,is关键字就返回false而不是null引用。


超级父类:System.Object

System.Object的核心成员

Equals() 默认情况下,如果被比较的项指向内存中同一个项,则方法会返回true。因此,Equals()用于比较对象引用,而不是对象的状态。一般情况下,这个方法被重写为:如果被比较的对象有相同的内部状态值(也就是基于值的语义),则返回true。要知道,如果重写Equals(),则还需要重写GetHashCode(),因为这些方法在内部用于Hashtable类型从容器读取子对象。ValueType类为所有结构重写了该方法,它们进行的比较是基于值的。

Finalize() 这个方法(在重写后)在对象销毁之前被调用来释放所分配的资源。

GetHashCode() 这个方法返回int来标识指定的对象实例。

ToString() 这个方法是用<namespace>,<type name>格式(叫做完全限定名)返回对象的字符串表示。这个方法可以被子类重写来返回名称/值对的标识字符串以表示对象的内部状态,而不是它的完全限定名。

GetType() 这个方法返回Type对象,它完整描述当前指向的对象。简而言之,这是所有对象都可用的运行时类型标识方法。

MemberwiseClone() 这个方法的作用是逐个成员地返回当前对象的副本,通常用于克隆对象。

目录
相关文章
|
API PHP C语言
php8安装fileinfo扩展
php8安装fileinfo扩展
2286 0
|
2月前
|
人工智能 JSON Shell
把 AI 漫剧做成一条可复现的生产管线:百炼 CLI 四步链路与单价账
本文聚焦AI漫剧工业化生产,以百炼CLI(v1.22.0)构建可复现、可验算、可计价的四步管线:角色设定图→参考图分镜→配音→生视频。强调“参考图”为唯一身份锚点,破除seed误区;提供实测命令、耗时与单价(单集约¥3.8),附完整可执行脚本,兼顾成本治理与合规边界。(239字)
把 AI 漫剧做成一条可复现的生产管线:百炼 CLI 四步链路与单价账
|
8月前
|
人工智能 运维 安全
开源知识库二次开发实操指南:模块化扩展与合规风险防控
在企业数字化转型进程中,知识管理的智能化、私有化与可扩展性成为技术团队核心诉求,传统文档管理因缺乏AI能力、集成性弱、部署繁琐等问题,已难以匹配现代研发与业务协作的效率需求。基于AGPL-3.0协议的AI大模型驱动开源知识库,以AI原生架构为核心,融合文档全生命周期管理、多端集成、私有化部署等能力,为企业构建智能化知识体系提供了轻量化且高扩展性的解决方案。本文将围绕“架构解析—能力落地—案例实践—合规指引—总结建议”的核心框架,结合实操心得,从技术架构特性、核心能力落地、实际应用案例及开源协议合规性等维度展开深度解析。
803 5
|
3月前
|
人工智能 API
Luna降价80%,老金教你20美元Plus当100美元Pro用
![Image](https://ucc.alicdn.com/pic/developer-ecology/p3shvhj26rigq_cfb66ec429e24ad3b3040b2007a76397.png) 先说结论。如果你正在用20美元的Codex Plus,这次先别急着掏100美元升级Pro。 你账户里已经有的GPT-5.6 Luna,刚刚降价80%。把它的Max推理打开,再让Sol
|
11月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用开发中的关键技术。前者为跨模型工具调用提供标准化协议,实现解耦与兼容;后者是模型调用外部功能的内置机制。二者互补,共同构建“意图解析-协议传输-工具执行”的分层架构,推动AI应用生态发展。
|
机器学习/深度学习 移动开发 算法
改进的激光方法与更快的矩阵乘法——论文阅读
Josh Alman与Virginia Vassilevska Williams在2021年提出改进的激光方法,将矩阵乘法指数ω的上界从2.37287降至2.37286。虽改进微小,但标志着自1986年以来核心技术的重要突破,展示了激光方法的潜力与优化空间。
499 3
|
移动开发 安全 API
VMware vCenter Server 6.7U3w (安全更新) - ESXi 集中管理软件
VMware vCenter Server 6.7U3w (安全更新) - ESXi 集中管理软件
438 2
VMware vCenter Server 6.7U3w (安全更新) - ESXi 集中管理软件
|
SQL 数据处理 数据库
如何理解SQL中的自连接?
说起自连接,想必小伙伴们都听说过。在进行数据处理时经常会使用到自连接,特别是像一些连续性的问题中使用的比较多。
如何理解SQL中的自连接?
|
人工智能 算法 安全
AI降噪耳机,可在嘈杂人群中单独通话,看一眼锁定目标
【6月更文挑战第15天】AI降噪耳机结合AI算法与麦克风阵列,能在嘈杂环境中确保清晰通话,提升沟通效率和隐私保护。尽管价格高、降噪效果有限且有安全隐患,它们为用户带来便利的同时,也引发了对隐私和安全的关注。
916 1
|
缓存 项目管理 开发工具
Git项目管理——提交项目和版本回退(二)
Git项目管理——提交项目和版本回退(二)
397 2

热门文章

最新文章