应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

面向对象中的继承, 虚方法, 抽象类,抽象函数,接口等概念

7150人阅读 2020/9/28 11:37 总访问:5182516 评论:2 收藏:2 手机
分类: 软件架构


面向对象继承中的构造函数问题:

在继承的前提下,会先执行父类的构造函数,默认执行无参构造函数。

因为在子类中是需要一个父类的对象,这样才可以继承到父类的属性方法等,在子类中可以使用base访问父类的内容

       

如果父类没有无参的构造函数,可以手动执行父类的构造函数。语法base(参数列表)执行父类的构造函数


先创建父类的对象在创建子类的对象
先创建父类 , 因为子类需要继承父类的内容,有base执行父类所以先创建父类

析构函数是先执行父类的还是子类的
先销毁子类,因为子类中有base指向父类的地址,所以在销毁子类的时候相当继承链的父类也会被gc销毁,因为gc销毁的原理是没有引用的时候才会被销毁,所以先销毁子类,因为子类销毁了,父类就没有引用了,父类就会被gc销毁。



      
         


虚方法:     

作用:用与被子类重写,使用多态,实现多态的一种手段        

关键字: virtual 

重写父类虚方法关键字:override,可以被重写也可以不被重写




使用虚函数实现上边不同等级员工发工资的例子:
公司有不同的人,员工有不能的等级,普通员工工资是3000,p2工资是5000,p3工资8000,如何使用面向对象的思想去实现

父类:

  1.     public class People
  2.     {
  3.         public int Age { getset; }
  4.         public string Name { getset; }
  5.         //发工资的虚方法
  6.         public virtual void Salary()
  7.         {
  8.             Console.WriteLine("发工资3000");
  9.         }
  10.     }

三个子类:   

  1.     //普通员工
  2.     public class Normal : People
  3.     {
  4.         /// <summary>
  5.         /// 重写父类的方法
  6.         /// </summary>
  7.         //public override void Salary()
  8.         //{
  9.         //    Console.WriteLine("发工资3000");
  10.         //}
  11.     }
  12.     //中级员工
  13.     class P2:People
  14.     {
  15.         /// <summary>
  16.         /// 重写父类的方法
  17.         /// </summary>
  18.         public override void Salary()
  19.         {
  20.             Console.WriteLine("发工资5000");
  21.         }
  22.     }
  23.     //高级员工
  24.     class P3 : People
  25.     {
  26.         /// <summary>
  27.         /// 重写父类的方法
  28.         /// </summary>
  29.         public override void Salary()
  30.         {
  31.             Console.WriteLine("发工资8000");
  32.         }
  33.     }

使用: 

  1. static void Main(string[] args)
  2.         {
  3.             People people = new Normal();
  4.             people.Salary();
  5.             People people2 = new P2();
  6.             people2.Salary();
  7.             people = new P3();
  8.             people.Salary();
  9.             Console.ReadLine();
  10.         }

 效果如下:
 

       

有虚方法,有没有虚属性,或者有没有虚索引?

有虚属性,因为属性本身其实是两个方法,也有虚索引,因为索引是一种特殊的属性,本质也是方法



抽象类与抽象函数


抽象类的作用:为了被子类继承,从而实现多态。是一种约定,约定必须要具体那些方法。

抽象函数作用:都是为了被子类重写,重写实现多态(同一个对象同一个方法,指向不同从而实现多态)

抽象函数特点:不能有方法体,子类必须重写        

关键字:abstract


虚函数和抽象函数的异同点:

相同点: 都可以被子类重写从而实现多态

不同点: 

1:虚函数有方法体,抽象函数没有方法体。也就是说虚函数可以有默认实现,抽象函数不行 

2:虚函数可以被重写,也可以不被重写,抽象函数必须被重写

3:抽象方法只能在抽象类中,抽象方法不能在普通类中
   

抽象类和普通类的异同点:

相同点:都可以被继承,也可以继承其他类,都可以有普通方法

不同点:

1:普通类可以被实例化,抽象类不行,抽象类提供一种约定一种类的模板,不能被实例化,因为实例化是没有意义,具体的类有实现才有意义

2:抽象类才能有抽象方法,普通类不行

使用抽象类实现不同图形的面积计算
父类:      

  1.     /// <summary>
  2.     /// 抽象类
  3.     /// </summary>
  4.     public abstract class Shape
  5.     {
  6.         public abstract int length { getset; }
  7.         public string type { getset; }
  8.         /// <summary>
  9.         /// 抽象方法
  10.         /// </summary>
  11.         public abstract void Area(int r);
  12.     }

         两个子类:   

  1.     public class Circle : Shape
  2.     {
  3.         public const double pi = 3.14;
  4.         /// <summary>
  5.         /// 重写方法,实现方法
  6.         /// </summary>
  7.         public override void Area(int r)
  8.         {
  9.             Console.WriteLine("圆形面积:"+(pi * r * r));
  10.         }
  11.         public override int length
  12.         {
  13.             get
  14.             {
  15.                 return length;
  16.             }
  17.             set
  18.             {
  19.                 length = value;
  20.             }
  21.         }
  22.     }
  23.     
  24.         public class Rectangle : Shape
  25.     {
  26.         public override void Area(int r)
  27.         {
  28.             Console.WriteLine("矩形面积:"+(r * r));
  29.         }
  30.         public override int length
  31.         {
  32.             get
  33.             {
  34.                 return length;
  35.             }
  36.             set
  37.             {
  38.                 length = value;
  39.             }
  40.         }
  41.     }

使用:   

  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Shape shape = new Circle();
  6.             shape.Area(6);
  7.             shape = new Rectangle();
  8.             shape.Area(6);    
  9.             Console.ReadLine();
  10.         }
  11.     }

效果如下:



有没有抽象属性?
可以有抽象属性,用法和虚属性类似,不同点:虚属性可以有自己的实现,抽象属性不行        


接口(在低版本中不能有方法体,在高版本中接口也可以有方法体,我们这里讨论低版本中)

和抽象类非常类似:都是一种约定,约定必须要具备的功能,接口里边的方法都是抽象的,不能有方法体。接口里边的方法默认都是公共的,默认都是抽象的,所以定义的时候只需要定义返回值方法名参数,public和abstract会自动加上                


接口和抽象类的异同点:

相同点:都是一种约定,约定必须要具备的功能

不同点:
1:接口里边不能有普通方法,但是抽象类可以 
2:重写接口的方法不需要加override,但是重写抽象函数必须要加
3:接口可以多重继承,但是抽象类不行

使用接口的方式来实现不同类型图形的面积计算   

  1.     public interface IShape
  2.     {
  3.         void Area(int r);
  4.         int length { get; }
  5.         int this[int index] { get; }
  6.     }
  7.     
  8.     //矩形类
  9.      public class Renctangle : IShape
  10.     {
  11.         public void Area(int r)
  12.         {
  13.             Console.WriteLine("矩形面积" + r * r);
  14.         }
  15.         public int length
  16.         {
  17.             get
  18.             {
  19.                 return length;
  20.             }
  21.         }
  22.         public int this[int index]
  23.         {
  24.             get { return 1; }
  25.         }
  26.     }
  27.     
  28.     //圆形类
  29.     public class Circle : IShape
  30.     {
  31.         public void Area(int r)
  32.         {
  33.             Console.WriteLine("圆形面积:" + 3.14 * r * r);
  34.         }
  35.         public int length
  36.         {
  37.             get
  38.             {
  39.                 return length;
  40.             }
  41.         }
  42.         public int this[int index]
  43.         {
  44.             get { return 1; }
  45.         }
  46.     }

效果和用法和上面一样

     




欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

雨雨雨雨辰

2020/9/28 16:32:59

[给力]

2020/9/28 19:28:13 回复

css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...

网页上传文件断点续传的实现无视文件大小上传以及datatables基本用法

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

如何使用图标像使用文字一样使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

通俗易懂什么是.NET?什么是.NET Framework?什么是.NET Core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

JS监听input、keydown有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

修改了css后让浏览器从缓存中更新

当我们修改了css后,如果不做一些操作,浏览器是不会自动更新我们的样式文件的。除非是过期或者用户手动刷新清理缓存等。所...

C MVC RedirectToAction跳转时候传递参数Action之间传值

MVC Action之间传值,页面跳转传值方法一:路由传值很简单直接使用 RedirectToAction(string actionName, string controller...

当你工作遇到以下几种状态时请果断跳槽走人

已经有想跳槽的念头,但是一直磨磨蹭蹭、犹犹豫豫的混日子,这种念头或者一直持续,或者是不是冒出头来占据你的思维了。于...

C与Java二进制编码转换补码

在C#与Java接口对接时,需要将图片转化为二进制编码传输,这时候发现c#转换出来的编码的值是0~255的范围,而java方需要的是...