当前位置: 首页 > news >正文

抽象类[abstract]_C#

引用:[陈广视频]

 

抽象类(abstract)

abstract修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类只能是其它类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

è     抽象类不能实例化

è     抽象类可以包含抽象方法和抽象访问器

è     不能用sealed修饰符修改抽象类,这意味着抽象类不能被继承

è     从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现

看一段代码:

using System ;

abstract class A

{

    protected int _x;

    public abstract void F();

    public abstract int X

    {

       get;set;

    }

}

class B:A

{

    public override void F()

    {

      

    }

    public override int X

    {

       get

       {

           return _x;

       }

       set

       {

           _x=value ;

       }

    }

}

class Test

{

    static void Main()

    {

       B b=new B ();

       b.X = 10;

       Console .WriteLine (b.X );

    }

}

->抽象方法是隐式的虚方法

->只允许在抽象类中使用抽象方法声明

->因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号({}),实现由一个重写方法提供,此重写方法是非抽象类的成员。

->在抽象方法声明中使用static或virtual修饰符是错误的。

->除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。

->在静态属性上使用abstract修饰符是错误的。

->在派生类中, 通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。

抽象类的构造函数:

任何情况下,抽象类都不应进行实例化,因此,正确定义其构造函数就非常重要。确保抽象类功能的正确性和扩展性也很重要。下列准则有助于确保抽象类能够正确地设计并在实现后可以按预期方式工作。

->不要在抽象类型中定义公共的或受保护的内部构造函数,具有public或protected internal可见性的构造函数用于能进行实例化的类型。任何情况下抽象类型都不能实例化。

->应在抽象类中定义一个受保护(protected)构造函数或内部(private)构造函数。

->如果在抽象类中定义一个受保护构造函数,则在创建派生类的实例时,基类可执行初始化任务。

再看一段代码:

using System ;

abstract class Employee

{

    protected string _name;

    protected Employee () {}

    protected Employee (string name)

    {

       _name = name ;

    }

    public abstract void StartWork();

 

}

class Manager:Employee

{

    public Manager (string name):base (name){}

    public override void StartWork()

    {

       //base .StartWork ();

       Console .WriteLine (_name +"Ï´ïÈÎÎñ");

    }

}

class Seller:Employee

{

    public Seller (string name):base (name){}

    public override void StartWork()

    {

       //base .StartWork ();

       Console .WriteLine (_name +"ÏúÊÛ²úÆ·");

    }

}

class Test

{

    static void Main()

    {

       Employee [] emp = new Employee[2] ;

       emp [0]=new Manager ("ÕÅÈý");

       emp [1]=new Seller ("ÀîËÄ");

       foreach (Employee e in emp )

       {

           e.StartWork ();

       }

    }

}

当所有的子类都要实现一些共同的功能的时候,这时顷向于使用虚方法,我们可以把这些共同的功能定义在基类中,子类通过base调用。如果所有子类的方法各不相干,则使用抽象方法。

抽象方法和虚拟方法的区别:

->抽象方法和虚拟方法的区别在于: 虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项,相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则派生类不能成为具体类)。

->abstract方法只能在抽象类中声明,虚方法则不是。

->abstract方法必须在派生类中重写,而virtual则不必

->abstract方法不能声明方法实体, 虚方法则可以、

->包含abstract方法的类不能被实例化,而包含virtual的类则可以。

 

转载于:https://www.cnblogs.com/wwewbw/archive/2010/02/22/1671409.html

相关文章:

  • 让我震撼的人
  • 网页中flash wmode属性
  • 用epoll实现异步的Echo服务器
  • HP主板案
  • 【会议】2009-11-14
  • php 地址引用
  • 《软件设计精要与模式》第二版推荐序四
  • Flash/Flex学习笔记(14):制作涂鸦板
  • repeater 当前行号
  • js几个验证函数
  • 在做JAVA和UCENTER整合登陆时一个要注意的问题
  • 自定义SiteMapProvider实现动态加载SITEMAP
  • linux操作: 快捷键记录
  • [转] Silverlight Navigation(多页面切换、传值) 之 一
  • jQuery 表格工具集
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 77. Combinations
  • HashMap ConcurrentHashMap
  • HTTP中的ETag在移动客户端的应用
  • iOS | NSProxy
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • nfs客户端进程变D,延伸linux的lock
  • ReactNativeweexDeviceOne对比
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spark本地环境的搭建到运行第一个spark程序
  • Spring框架之我见(三)——IOC、AOP
  • 开发基于以太坊智能合约的DApp
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 配置 PM2 实现代码自动发布
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 线上 python http server profile 实践
  • 以太坊客户端Geth命令参数详解
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 自制字幕遮挡器
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)UDP基本编程步骤
  • (转载)PyTorch代码规范最佳实践和样式指南
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .a文件和.so文件
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net FrameWork总结
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net Stream篇(六)
  • .net 中viewstate的原理和使用
  • .net经典笔试题
  • .NET中 MVC 工厂模式浅析
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798