.net知识梳理——3.面向对象

墨遥 墨遥     2022-12-08     248

关键词:

1. 面向对象

1.1        封装、继承、多态理解

1.1.1  封装

封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。降低耦合、提高重用性。

1.1.2  继承

子类拥有父类的一切属性和行为。可以实现代码的重用,.NET中类只能单继承。

1.1.3  多态

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态按照不同的维度有以下几种:

1.1.3.1      编译时多态

编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。重载只是针对一个类内部的几个参数不同,名称相同的方法。

1.1.3.2      运行时多态

运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员实现。

1.1.3.3      接口多态

一个类可以实现多个接口。

1.1.3.4      继承多态

一个基类可以扩展多个子类。

1.2        覆写override、重载overload

1.2.1  覆写override

子类对父类虚方法、抽象方法的重新实现。子类对父类的虚方法可重写也可不重写,对父类的抽象方法,必须重写,都需要用override关键字修饰,如下:

/// <summary>

    /// 父类,抽象类

    /// </summary>

    public abstract class ParentClass

   

        public ParentClass(string name)

       

            Console.WriteLine($"This is ParentClass,My name is name");

       

        public void CommonMethod()

       

            Console.WriteLine("ParentClass CommonMethod");

       

 

        /// <summary>

        /// 虚方法,包含方法实现,可以被子类重写

        /// </summary>

        public virtual void VirtualMethod()

       

            Console.WriteLine("ParentClass VirtualMethod");

       

 

        /// <summary>

        /// 抽象方法,子类必须实现该方法

        /// </summary>

        public abstract void AbstractMethod();

   

    /// <summary>

    /// 子类

    /// </summary>

    public class ChildClass:ParentClass

   

        /// <summary>

        /// 子类实例化的时候,要先进行父类的实例化

        /// </summary>

        public ChildClass()

            :base("Olive")//调用父类构造函数

       

            Console.WriteLine("This is ChildClass");

       

 

        public new void CommonMethod()

       

            Console.WriteLine("ChildClass CommonMethod");

              

       

        /// <summary>

        /// 重写父类的虚方法

        /// </summary>

        public  override void VirtualMethod()

       

            Console.WriteLine("ChildClass VirtualMethod");

            base.VirtualMethod();//调用父类方法

       

 

        /// <summary>

        /// 实现父类的抽象方法

        /// </summary>

        public sealed override void AbstractMethod()

       

            Console.WriteLine("ChildClass AbstractMethod");

       

 

ParentClass parent = new ChildClass();

            Console.WriteLine("parent.CommonMethod()");

            parent.CommonMethod();

 

            Console.WriteLine("parent.VirtualMethod()");

            parent.VirtualMethod();

 

            Console.WriteLine("parent.AbstractMethod()");

        parent.AbstractMethod();

结果如下:

 

由以上结果可以发现,子类用new修饰的方法,

运行ParentClass  p=new ChildClass();

p.CommonMethod();

会输出ParentClass CommonMethod

这是因为class ChildClass继承于class ParentClass,现在ChildClass中的CommonMethod函数隐藏ParentClass中的CommonMethod,所以从ChildClass (包括继承于ChildClass的子类)的角度来看类中的CommonMethod就是ChildClass. CommonMethod,ParentClass的CommonMethod不可见,但是如果从ParentClass的角度来看ChildClass,ParentClass只认识类ChildClass中继承于类ParentClass的CommonMethod函数,对于ChildClass类中的CommonMethod它不可见,所以ParentClass a=new ChildClass ();a. CommonMethod ();相当于是调用了类ChildClass中继承于ParentClass的CommonMethod函数

1.2.2  重载overload

重载只是针对一个类内部的几个参数不同,名称相同的方法。

/// <summary>

        /// 重载(编译时多态)

        /// </summary>

        /// <param name="name"></param>

        public void CommonMethod(string name)

       

            Console.WriteLine($"ChildClass.CommonMethod的重载:Name is name");

       

        public void CommonMethod(int age)

       

            Console.WriteLine($"ChildClass.CommonMethod的重载:Age is age");

       

        public void CommonMethod(string name,int age)

       

            Console.WriteLine($"ChildClass.CommonMethod的重载:Name is name, Age is age");

       

        public void CommonMethod(int age,string name)

       

            Console.WriteLine($"ChildClass.CommonMethod的重载:Age is age, Name is name");

       

1.3        抽象类、接口理解和选择

1.3.1  抽象类

抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。

抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。另外,实现抽象方法由override方法来实现

抽象类就是父类+约束,父类是为了更好的代码重用,约束是为了多态变化。

/// <summary>

    /// 父类,抽象类

    /// </summary>

    public abstract class ParentClass

   

        public ParentClass(string name)

       

            Console.WriteLine($"This is ParentClass,My name is name");

       

        public void CommonMethod()

       

            Console.WriteLine("ParentClass CommonMethod");

       

 

        /// <summary>

        /// 虚方法,包含方法实现,可以被子类重写

        /// </summary>

        public virtual void VirtualMethod()

       

            Console.WriteLine("ParentClass VirtualMethod");

       

 

        /// <summary>

        /// 抽象方法,子类必须实现该方法

        /// </summary>

        public abstract void AbstractMethod();

   

1.3.2  接口

接口是包含一组方法的抽象类型,其中每一种方法都有其名称、参数和返回值。为了约束,告诉外部有哪些功能。

接口包含方法(不包含方法实现)、事件、属性、索引器,不包含字段、委托。

一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

public interface ITestInterface

   

        string Show(string name);

        string Info get; set;

        int this[int i] get;

        event Action DoWorkHandler;

   

1.3.3  如何选择

接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系。

抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。如果只是为了约束,有哪些功能,则选择接口,如果包含代码的重用则选择抽象类。

前端面试知识点梳理之五——javascript面向对象

一、相关问题  1.创建对象有几种方法  2.原型,构造函数,实例,原型链  3.instanceof的原理  4.new运算符二、问题解答1.创建对象有几种方法 查看详情

重新梳理it知识之java-05面向对象

一、Java面向对象学习的三条主线:1.Java类及类的成员:属性、方法、构造器;代码块、内部类2.面向对象的三大特征:封装性、继承性、多态性。(抽象性)3.其他关键字:this、super、static、final、abstract、interface、package、import... 查看详情

面向对象知识点梳理

1.核心思想:万物皆对象(OOP面向对象)2.软件出现的目的(1)用计算机的语言描述现实世界(2)用计算机解决现实世界的问题3.面向对象设计和开发程序的好处(1)(人)和(计算机)交流更加流畅(2)提高设计和开发效率4.生活中定义"看得见... 查看详情

重新梳理it知识之java-05面向对象

一、面向对象特征之三:多态性1.理解多态性一个事物的多种形态2.对象的多态性父类的引用指向子类的对象(或子类的对象赋给父类的引用)3.多态的使用:虚拟方法的调用有了对象的多态性以后,我们在编译期,只能调用父类... 查看详情

面向对象原型链继承知识梳理

单例模式:就是一个对象咯varperson={name:‘xuwen‘,age:17};varperson2={name:‘xiaoxu‘,age:25}工厂模式:就是一个函数,解决批量生产问题1functionfn(name,age){2varobj={};3obj.name=name,4obj.age=age,5obj.write=function(){6console.log(obj.nam 查看详情

面向对象知识点梳理篇一(代码片段)

0.OOP-Python面向对象Python的面向对象面向对象编程基础公有私有继承组合,Mixin魔法函数魔法函数概述构造类魔法函数运算类魔法函数1.面向对象概述(ObjectOriented,OO)OOP思想接触到任意一个任务,首先想到的是任务这个世界的构... 查看详情

java知识点梳理——装箱和拆箱

1、前言:Java是典型的面向对象编程语言,但其中有8种基本数据类型不支持面向对象编程,基本数据类型不具备对象的特性,没有属性和方法;Java为此8种基本数据类型设计了对应的类(包装类),使之相互转换,间接实现基本... 查看详情

.net知识梳理——5.委托(代码片段)

1.委托委托就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法。在IL中委托就是一个类。继承自System.MulticastDelegate特殊类,不能被继承。1.1       委托的声明、实例化、调用1.1.1 声明委托用deleate关键... 查看详情

java面向对象知识(上:基础篇)(代码片段)

Java面向对象(基础篇)一、面向对象的思想1、什么是面向对象1.1面向过程1.2面向对象二、类和对象2.1类2.1.1类的组成2.2对象三、类和对象在代码中的运用3.1类的应用3.1.1类定义的格式3.2对象的应用3.2.1创建对象的格式以及... 查看详情

typescript知识梳理

概述 TypeScript简称TS,具有类型系统,且是JavaScript的超集。它可以编译成普通的JavaScript代码。TypeScript支持任意浏览器,任意环境,任意系统并且是开源的。通过TS能够生成JS,TS是结构性语言,能够类似C#和Java那样,面向对象编... 查看详情

java面向对象大致梳理

面向对象思想、面向对象思想概述:Java设计语言面向对象:Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指... 查看详情

.net知识梳理——8.aop

1.AOPAOP:允许开发者动态的修改静态的OO模型,就像现实生活中对象在生命周期中会不断的改变自身。   AOP是一种编程思想,是OOP思想的补充1.1       AOP面向切面编程1.1.1 AOP有以下好处1.1.1.1     聚焦核心业务... 查看详情

.net知识梳理——8.aop

1.AOPAOP:允许开发者动态的修改静态的OO模型,就像现实生活中对象在生命周期中会不断的改变自身。   AOP是一种编程思想,是OOP思想的补充1.1       AOP面向切面编程1.1.1 AOP有以下好处1.1.1.1     聚焦核心业务... 查看详情

java面向对象泛型

这个第一篇知识梳理的博客,希望我可以坚持下去将知识进行总结。这是在极客学院里看到的视频,目录如下,蛮清晰的。然后我将视频中所说再记忆下。java面向对象之泛型:认识泛型  JavaSE1.5的新特性,泛型的本质是参数... 查看详情

面向对象知识整理

魔术方法1.__construct构造函数2.__destruct析构函数3.__set/__get封装变量里的读取设置4.__tostring输出对象5.__clone克隆6.__autoload自动加载//面向对象的关键字1.class定义类2.public/protected/private访问修饰符3.$this这个对象4.extends继承5.override/overl... 查看详情

梳理知识

  总结一下自己今天记录和学到的知识一 vimware在win10的情况下怎么安装(1)首先先关闭防火墙以及杀毒软件。(2)试着安装14.1版本二怎么把eno改为eth(1)先用上下光标,止住sleet(60)(2)按住tab健(3)空格 net,ifna... 查看详情

js常见知识点3.面向对象之继承设计模式

一、面向对象的三大特征  建议回复:   封装:屏蔽内部细节、调用外部接口实现对应功能(函数调用)  继承:子类继承父类中的属性和方法  多态(js中不存在多态的概念)二、继承  建议回复:    继承:... 查看详情

spring核心组件知识梳理

Spring的一些概念和思想Spring的核心:AOP、IOC。简单点说,就是把对象交给Spring进行管理,通过面向切面编程来实现一些"模板式"的操作,使得程序员解放出来,可以更加关注业务实现。Spring已经是一站式的开源框架解决方案,而... 查看详情