• 黑马程序员_面向对象的三个基本特征


    面向对象的理解

    面向对象和面向过程都是一种编程思想,面向对象是相对于面向过程而言的,面向过程是面向对象的基础。

    面向过程:完成任务由具备相应功能的函数,强调的是行为过程,完成这项任务是怎样做的!

    面向对象:完成任务由具备相应功能的实例对象,强调的是具备相应功能的实例对象,完成这项任务的结果是什么!

    面向对象编程的重要的组成要素:类和对象

    类:类是用来描述事物的,类是抽象的概念,仅仅是模板,类不占内存

    对象:对象是这类事物存在的个体,描述对象就是描述对象的行为和特征,对象占内存。

    属性的作用:属性是为了保护与之相对应的字段的,保证对字段的读取和赋值符合要求,允许外部访问的变量一般要声明为属性,属性的本质是方法。

    一、封装:将一段实现指定功能的代码包装起来,方便使用。

      封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。在这个阶段定义对象的接口。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。事实上,信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

    二、继承:子类可以调用父类方法,实现了资源复用。

      继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这也体现了大自然中一般与特殊的关系。继承性很好的解决了软件的可重用性问题。比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。但是有的应用程序用于文字处理,有的应用程序用于绘图,这是由于派生出了不同的子类,各个子类添加了不同的特性。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace 继承
      7 {
      8     #region 人类,父类。
      9     class Person
     10     {
     11         private string name;
     12 
     13         protected string Name
     14         {
     15             get { return name; }
     16             set { name = value; }
     17         }
     18 
     19         private char sex;
     20 
     21         protected char Sex
     22         {
     23             get { return sex; }
     24             set { sex = value; }
     25         }
     26 
     27         private int age;
     28 
     29         protected int Age
     30         {
     31             get { return age; }
     32             set { age = value; }
     33         }
     34 
     35         public Person(string name, char sex, int age)
     36         {
     37             this.Name = name;
     38             this.Sex = sex;
     39             this.Age = age;
     40         }
     41     } 
     42     #endregion
     43 
     44     #region 老师类,继承(派生)于人类,子类。
     45     class Teacher : Person
     46     {
     47         private int year;
     48 
     49         public int Year
     50         {
     51             get { return year; }
     52             set { year = value; }
     53         }
     54 
     55         private int salary;
     56 
     57         public int Salary
     58         {
     59             get { return salary; }
     60             set { salary = value; }
     61         }
     62 
     63         public Teacher(string name, char sex, int age, int year, int salary)
     64             : base(name, sex, age)
     65         {
     66             this.Year = year;
     67             this.Salary = salary;
     68         }
     69 
     70         public void SayHello()
     71         {
     72             Console.WriteLine("我是{0},当了{1}年老师,我的月薪是{2}。", Name, Year, Salary);
     73         }
     74     } 
     75     #endregion
     76 
     77     #region 学生类,继承(派生)于人类,子类。
     78     class Student : Person
     79     {
     80         private string hobby;
     81 
     82         protected string Hobby
     83         {
     84             get { return hobby; }
     85             set { hobby = value; }
     86         }
     87 
     88         private int classID;
     89 
     90         protected int ClassID
     91         {
     92             get { return classID; }
     93             set { classID = value; }
     94         }
     95 
     96         public Student(string name, char sex, int age, string hobby, int classID)
     97             : base(name, sex, age)
     98         {
     99             this.Hobby = hobby;
    100             this.ClassID = classID;
    101         }
    102 
    103         public void SayHello()
    104         {
    105             Console.WriteLine("我是{0},我是{1}孩,今年{2}岁,爱好是{3},在{4}班。", Name, Sex, Age, Hobby, ClassID);
    106         }
    107     } 
    108     #endregion
    109 
    110     class Program
    111     {
    112         static void Main(string[] args)
    113         {
    114             Student s = new Student("张三", '', 18, "踢足球", 3);
    115             s.SayHello();
    116             Teacher t = new Teacher("王老师", '', 30, 5, 8000);
    117             t.SayHello();
    118             Console.ReadKey(true);
    119         }
    120     }
    121     //输出结果:
    122     //我是张三,我是男孩,今年18岁,爱好是踢足球,在3班。
    123     //我是王老师,当了5年老师,我的月薪是8000。
    124 }
    继承的演示
    三、多态:同一种表现形式实现不同的方法。
      多态性是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑-粘贴操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace 隐式隐藏父类方法
     7 {
     8     class Father
     9     {
    10         public void Write()
    11         {
    12             Console.WriteLine("In the Father.");
    13         }
    14     }
    15     class Son : Father
    16     {
    17         //父类与子类方法名、参数(签名)、类型相同
    18         
    19         //public void Write()              
    20         //使用new   显式隐藏基类方法  最好加上new,别人看代码的时候知道父类有一个同名方法。
    21         //不使用new 隐式隐藏基类方法
    22         public new void Write()
    23         {
    24             Console.WriteLine("In the Son.");
    25         }
    26     }
    27     class Program
    28     {
    29         static void Main(string[] args)
    30         {
    31             Father f1 = new Father();
    32             f1.Write();
    33 
    34             Son s1 = new Son();
    35             s1.Write();
    36 
    37             Father f2 = s1;
    38             f2.Write();
    39             Console.ReadKey(true);
    40         }
    41         //输出结果:
    42         //In the Father.
    43         //In the Son.
    44         //In the Father.
    45     }
    46 }
    隐式隐藏父类方法
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace 重写父类方法
     7 {
     8     class Father
     9     {
    10         public virtual void Write()
    11         {
    12             Console.WriteLine("In the Father.");
    13         }
    14     }
    15     class Son : Father
    16     {
    17         public override void Write()
    18         {
    19             Console.WriteLine("In the Son.");
    20         }
    21     }
    22     class Program
    23     {
    24         //new 则隐藏,over则重写,
    25         //隐藏看类型,重写只顾新!
    26         //                  ——蒋坤
    27         static void Main(string[] args)
    28         {
    29             Father f1 = new Father();
    30             f1.Write();
    31 
    32             Son s1 = new Son();
    33             s1.Write();
    34 
    35             Father f2 = s1;
    36             f2.Write();
    37             Console.ReadKey(true);
    38         }
    39         //输出结果:
    40         //In the Father.
    41         //In the Son.
    42         //In the Son.
    43     }
    44 }
    重写父类方法
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace 多态USB的例子
     7 {
     8     class Standard
     9     {
    10         public virtual void USB()
    11         {
    12             Console.WriteLine("USB标准。");
    13         }
    14     }
    15     class Phone : Standard
    16     {
    17         public override void USB()
    18         {
    19             Console.WriteLine("充电中");
    20         }
    21     }
    22     class Light : Standard
    23     {
    24         public override void USB()
    25         {
    26             Console.WriteLine("灯亮了");
    27         }
    28     }
    29     class Program
    30     {
    31         static void Main(string[] args)
    32         {
    33             while (true)
    34             {
    35                 Console.WriteLine(@"请选择插入的USB设备:
    36 1.手机
    37 2.灯");
    38                 string select = Console.ReadLine();
    39                 Standard s;
    40                 switch (select)
    41                 {
    42                     case "1": s = new Phone(); break;
    43                     case "2": s = new Light(); break;
    44                     default: s = null; break;
    45                 }
    46                 if (s != null)
    47                 {
    48                     s.USB();
    49                 }
    50                 else
    51                 {
    52                     Console.WriteLine("输入有误,请重新输入:");
    53                 }
    54                 Console.ReadKey(true);
    55                 Console.Clear();
    56             }
    57         }
    58     }
    59 }
    多态USB例子
  • 相关阅读:
    LeetCode Binary Tree Inorder Traversal
    解析看病难看病贵
    [转]微服务概念解析
    OC中几种延时操作的比較
    Android AOP之路三 Android上的注解
    浅析C#中的托付
    图类算法总结
    有关https安全的相关内容介绍
    BZOJ 3684: 大朋友和多叉树 [拉格朗日反演 多项式k次幂 生成函数]
    Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]
  • 原文地址:https://www.cnblogs.com/dlwcg/p/3611451.html
Copyright © 2020-2023  润新知