【.Net基础拾遗】深入浅出面向对象

0X1 引言

  提起面向对象,每个人都有不同的见解。但提的最多的无非就是:对象、封装、继承、多态。差不多就是这些元素构成了面向对象设计开发的基本逻辑。面向对象编程,“对象”指的是什么?这里的"对象"可不是指“异性对象”,而是我们在开发中常常使用的:类。

0X2 对象 

  出生:对象就像个人的人,生而入世,死而离世。首先我们看看一个对象是如何产生的呢?在执行New操作后,系统首先会在内存中为其分配一定的内存空间,然后初始化其附加成员,调用构造函数执行初始化,这样一个函数就完成了初始化。

Person person=new Person("大壮他哥",25);

  旅程:在某种程度上就是外界通过方法与对象交互,从而达到改变对象状态信息的过程。这也和人的生存之道暗合。

person.ChangeAge(26)

  权限:我们都知道继承,儿子可以继承父亲的姓氏、基因、财产和一切可以遗留的东西,但并不代表就可以继承所有。因为父亲有一些隐私的部分为父亲独有,不可继承。所以,我们就需要在程序中标识哪些可继承或不可继承(这里的继承可以理解为访问权限)。.Net框架为我们内置了五种访问权限:

  • public:最高访问权限,公司的董事会具有最高的决策权与管理权;
  • protected:部门经理,具有对本部门的直接管辖权,面向对象中体现为子类继承纵向关系的访问约定;
  • internal:类似于公司的职能部门的职责,不管是否具有上下级关系,人力资源部都有管辖其他部门员工的能力;(面向对象中体现为同一程序集的访问权限,只要是隶属于同一程序集,对象即可访问其属性等,不管是否存在隶属关系;)
  • protected internal:副总经理,从横向到纵向都有管理权;
  • private:最低访问权,公司一般职员,管好自己即可;

0X3 继承

  什么是继承?

      

                                                      图1  继承关系图

     继承,就是类与类之间的一种关系。继承的类成为子类(图1中小车和飞机就成为子类)、派生类。而被集成的类则成为父类、基类或超类。通过集成,使得子类拥有父类中允许继承的属性和方法。同时子类也可以添加新的方法或者属性在建立一个新的类层次。

  继承的实现与本质?

     

      图2 继承的实现

    如图2所示的这个继承体系中,Vehicle为所有交通工具的基类,其定义了所有交通工具都具备的"启动"和"停止"方法。其中Aricraft类实现了IFlyable接口,使得Aricraft可以实现Fly()这一特性。这样的好处是显而易见的,通过IFlyable接口,实现了对象与行为的分离,这样我们就无需担心继承不当而导致Car也拥有了Fly()的能力,保护了系统的稳健性。

  

public class Vehicle
    {
        public virtual void Start()
        {
            Console.WriteLine("Vehicle is Start");
        }

        public virtual void Stop() {
            Console.WriteLine("Vehicle is Stop");
        }
    }

    public class Car: Vehicle {
        public override void Start()
        {
            Console.WriteLine("Car is Start");
        }

        public override void Stop()
        {
            Console.WriteLine("Car is Stop");
        }
    }
    public class Aircralt : Vehicle, IFlyable
    {
        public void Fly()
        {
            Console.WriteLine("Aircralt is Fly");
        }
    }

    public interface IFlyable {
        void Fly();
    }
static void Main(string[] args)
        {
            Vehicle car = new Car();
            car.Start();
            Console.ReadLine();
        }

代码演示

    我们来简单分析一下对象的创建过程:

Vehicle car = new Car();

     Vehicle car是创建一个Vihicle类型的引用,而new Car()则是创建一个Car对象,分配内存空间和初始化操作,然后将这个对象的引用赋给car变量,也就是建立car变量和Car对象的关联。我们从继承的角度来分析CLR在运行时如何执行对象的创建过程的。我们以car为例,car对象一经建立,首先会利用递归查找到其父类,并为父类分配存储空间。对象的创建过程是按照顺序完成了对整个父类以及本身字段的内存创建。并且字段的存储顺序是由上到下的排列,最高层地的排在上。其原因是如果父类和子类出现了同名的属性,编辑器会自动认为这是两个不同的字段而加以区别。然后是方法表的创建,需要注意一点的是方发表的创建在是类第一次加载到AppDomain是完成的。在创建对象的时候只是讲对象的TypeHandle指向方发表的Loader Heap上,也就是说,方法表是在先于对象创建存在的。类似于字段的创建过程,方法表的创建也是先父类后子类的。在创建子类方法表的时候会先从其最高级别的父类向下递归。首先把父类的所有的虚方法Copy一份,然后和子类方法表做对比,如果有重写操作则以子类的方法覆盖父类的方法。同时添加父类的非虚方法,从而完成car方法表的创建。

    从我们的分析和上面创建对象的过程中,我们对继承应有了以下更明确的认识:

  • 继承是可以传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法。
  • 子类可以调用父类的方法和字段,但是!父类不能调用子类的方法和字段。
  • 子类不光继承父类的共有成员,同时也继承了父类的私有成员,只是在子类中访问不到。(不知道可否通过反射访问到。。。。希望可以一起探讨这个问题。)

 

 继承的分类与规则?

  继承的分类可以分为两种:实现继承与接口继承

  

  实现继承与接口继承的区别:

    抽象类适合于有族层概念的类间关系,而接口最适合为不同的类提供通用功能

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

    接口多定义对象的行为;抽象类多定义对象的属性

    版本式的问题最好以抽象类来实现

    因为值类型是密封的,所以只能实现接口,而不能继承类

  

  好晚了,明天还要上班,,,不写了,未完待续。。。大家觉得还可以的话就点个赞吧。。。。

时间: 2024-10-20 23:50:16

【.Net基础拾遗】深入浅出面向对象的相关文章

.NET基础拾遗(2)面向对象的实现和异常的处理基础

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 一.面向对象的实现 1.1 C#中的类可以多继承吗? 在C#中申明一个类型时,只支持单继承(即继承一个父类),但支持实现多个接口(Java也是如此).像C++可能会支持同时继承自多个父类,但.NET的设计小组认为这样的机制会带来一些弊端,并且没有必要. 首先,看看多继承有啥好处?多继承的好处是更加贴近地设计类型.例如,当为一个图形编辑器设计带文本框的矩形类型时,最方便的方法可能是这个类型既继承自文本框类

深入浅出面向对象分析与设计笔记

1.在搜索匹配时注意大小写问题. 2.别为了解决旧问题而产生新问题. 3.使用enum的好处:使用enum的方法或类会受到它的保护,不会有未定义的enum的值.因此不会有打错字或拼错字,对任何具有标准范围或合法值的东西都能避免取得坏数据. 4.任何时候看到重复程序代码,就找个地方进行封装. 5.委托: 6.Java匿名内部类是一种特殊的继承方式,既可以扩展类,也可以实现接口,但是不能两者兼备,而且若实现接口也只能实现一个接口.由于其没有名字,因此不会有命名构造器,但可以实例初始化.如果定义一个匿

Ado.Net基础拾遗二:插入,更新,删除数据

插入数据 1 public void InsertDataToSQL() 2 { 3 string conStr = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 4 SqlConnection conn = new SqlConnection(conStr); 5 conn.Open(); 6 7 SqlCommand cmd = new SqlCommand

Python基础(四) 基础拾遗、数据类型进阶

一.基础拾遗 (一).变量作用域 外层变量,可以被内层变量直接调用:内层变量,无法被外层变量使用.这种说法在其它语言中适用,在python中除了栈以外,正常的变量作用域,只要执行声明并在内存中存在,该变量就可以在下面的代码中使用. (二).位运算符.三元运算 1,位运算符,请看下面代码 1 128 64 32 16 8 4 2 1 2 0 0 0 0 0 0 0 0 3 4 5 #!/usr/bin/env python 6 7 a=60 #00111100 (将十进制转换成二进制,进行位运算)

[.net 面向对象编程基础] (2) 关于面向对象编程

[.net 面向对象编程基础]  (2)  关于面向对象编程 首先是,面向对象编程英文 Object-Oriented Programming 简称 OOP 通俗来说,就是 针对对象编程的意思 那么问题来了什么是对象,不是“女盆友”“找对象”的这个对象.当然也可以理解“女盆友”也是“对象”的一种. 面向对象中的对象,指一切皆是对象 专业述语解释我们无视就好 只所有面向对象编程,是因为之前有一个面向过程编程 面向过程——是指把问题分解成步骤,一步一步实现 面向对象——是把构成问题的事务分成各个对象

Java基础知识:面向对象&类图

类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称.在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责.在定义类的时候,将类的职责分解成为类的属性和操作(即方法).类的属性即类的数据职责,类的操作即类的行为职责.设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分. 1.面向对象特性 1)抽象 2)继承 3)封装 4)多态 2.类图: 在软件系统

基础拾遗------webservice详解

基础拾遗 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗------接口详解 基础拾遗------泛型详解 前言 工作当中常用的服务接口有三个wcf,webservice和webapi.首先第一个接触的就是webservice,今天大致总结一下. 1.webservice概念相关 1.1.Web Service也叫XML Web Service WebService 是一种可以接收从Inter

基础拾遗------redis详解

基础拾遗 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗------接口详解 基础拾遗------泛型详解 前言 这篇文章和以往的基础拾遗有所不同,以前的介绍的都是c#基础,今天介绍的是redis.因为项目中一只在使用,我想现在大部分项目中都会用到nosql,缓存,今天就介绍一下redis..废话少说下面开始正题. 1.redis是什么? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 对的redi

Java基础教程:面向对象编程

Java基础教程:面向对象编程 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台无关性.Java为解释型语言,编译器会把Java代码变成"""中间代码",然后在JVM上解释执行. 3.Java提供了很多内置的类库,这些类库简化了开发人员的程序设计工作,同时缩短了项目开发时间. 4.Java语言提供了对Web应用的支持. 5.Java语言提供了较好的安全性和健

Java基础教程:面向对象编程[2]

Java基础教程:面向对象编程[2] 三大特性 封装 封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问. 使用封装我们可以对成员变量进行更精确的控制,同时隐藏信息,实现细节等. 方法: public class Person{ private String name; private int age; ? public int getAge(){ return age;