翼度科技»论坛 编程开发 .net 查看内容

Learning hard C#学习笔记——读书笔记 03

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
C# 是面向对象的语言,每次到这里就会有一个问题,什么是对象,其实一句话就可以解释,那就是——万物皆是对象,这句话就像 “如来”一样抽象,其实,我们无须在这上面耗费太大的精力,我们随着学习的深入,对象的概念自然会深入到脑海中
所有面向对象的编程语言都有以下三个基础特征

  • 封装——把客观的事物封装成类,并将类内部实现隐藏
  • 继承——通过继承可以复用父类的代码
  • 多态——允许将子对象赋值给父对象的一种能力
1.封装


封装是把类的内部数据隐藏,不让对象实例直接对齐操作,C# 提供属性机制来对内部的状态进行操作,在 C# 中封装可以通过public、private、protected、internal等关键字来体现
为什么要进行封装呢?
封装是一种程序内部的保护机制,保护数据的完整性,
例如:我定义一个人的类,创建了它的对象,将其内部的age属性赋值为 -5 ;但是我们都知道,人的年龄是没有-5的,这种随意的赋值,就破坏了数据的完整性
解决上面的情况,就需要使用下面的这种方式
  1. public class Person
  2. {
  3.     private string _name;
  4.     private int _age;
  5.   
  6.     public string Name {
  7.         get { return _name; }
  8.         set { _name = value; }
  9.     }
  10.   
  11.     public int Age {
  12.         get { return _age; }
  13.         set {
  14.             if(value < 0 || value > 120)
  15.             {
  16.                 throw(new ArgumentOutOfRangeException("AgeIntPropery",value,"年龄必须在0~120之间"));
  17.             }else {
  18.                 _age = value;
  19.             }
  20.         }
  21.     }
  22. }
复制代码
2.继承


在 C# 中一个类可以继承另外一个已有的类,(密封类除外),被继承的类被称为基类或者父类


为什么需要继承呢?
继承的作用主要是为了复用基类的内容,但是继承也有自己的缺点,就是耦合性太大,要结合场景来使用
  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         Horse horse = new Horse();
  6.         horse.Age = 2;
  7.   
  8.         Sheep sheep = new Sheep();
  9.         sheep.Age = 1;
  10.         Console.WriteLine("羊的年龄:{0}",sheep.Age);
  11.         Console.Read();
  12.      }
  13. }
  14. public class Animal
  15. {
  16.     private int _age;
  17.     public int Age
  18.     {
  19.         get { return _age; }
  20.         set
  21.         {
  22.             if(value < 0 || value > 10)
  23.             {
  24.                 throw (new ArgumentOutOfRangeException("AgeIntProperty",value,"年龄必须在0-10之间"))
  25.             }
  26.             _age = value;
  27.         }
  28.     }
  29. }
  30. public class Horse:Animal{}
  31. public class Sheep:Animal{}
复制代码
2.1 密封类

密封类不能被另外一个类继承,如果强行继承,就会编译错误
  1. public sealed class SealedClass
  2. {
  3.     // 在这里定义类成员
  4. }
  5. // 下面的代码会编译错误
  6. public class Test:SealedClass{
  7. }
复制代码
2.2 子类初始化的顺序


继承之后,我们不仅仅会调用子类的构造函数,还会调用基类的构造函数,子类的初始化顺序如下:

  • 初始化类的实例字段
  • 调用基类的构造函数,如果没有指明基类,则调用System.Object构造函数
  • 调用子类的构造函数
  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         Horse horse = new Horse();
  6.         horse.Age = 2;
  7.   
  8.         Sheep sheep = new Sheep();
  9.         sheep.Age = 1;
  10.         Console.WriteLine("羊的年龄:{0}",sheep.Age);
  11.         Console.Read();
  12.      }
  13. }
  14. public class Animal
  15. {
  16.     // 2.初始化基类的成员变量
  17.     private int _age;
  18.     public int Age
  19.     {
  20.         get { return _age; }
  21.         set
  22.         {
  23.             if(value < 0 || value > 10)
  24.             {
  25.                 throw (new ArgumentOutOfRangeException("AgeIntProperty",value,"年龄必须在0-10之间"));
  26.             }
  27.             _age = value;
  28.         }
  29.     }
  30.     // 3.调用基类的构造
  31.     public Animal() {
  32.     }
  33. }
  34. public class Horse:Animal{
  35.     // 1.先初始化
  36.     private string run;
  37.     // 4.调用子类构造
  38.     public Horse() {
  39.     }  
  40. }
  41. public class Sheep:Animal{
  42.     private string eat;
  43.   
  44.     public Sheep() {
  45.     }
  46. }
复制代码
3.多态

由于有了继承,子类需要复写父类中的方法,来实现子类特有的行为,这样的技术在面向对象的编程就是多态,多态即相同类型对象调用相同的方法,却表现出不同的行为

3.1 使用 virtual 和 override 关键字来实现方法重写


只有基类声明为 virtual 或 abstract 时,才可以被派生类重写;而子类想要改变虚方法的实现行为,只能使用override关键字
[code]class Program{    static void Main(string[] args)    {        Animal horse = new Horse();        horse.Voice();        Animal sheep = new Sheep();        // 相同类型对象,调用相同的方法,表现出的行为不同        sheep.Voice();        Console.Read();    }}public abstract class Animal{    private int _age;    public int Age    {        get { return _age; }        set        {            if (value < 0 || value > 10)            {                throw (new ArgumentOutOfRangeException("AgeIntProperty", value, "年龄必须在0-10之间"));            }            _age = value;        }    }    public virtual void Voice()    {        Console.WriteLine("动物开始发出声音");    }}public class Horse : Animal{    public override void Voice()    {        // 调用基类的方法        base.Voice();        Console.WriteLine("
来源:https://www.cnblogs.com/trueasureyuki/archive/2023/07/17/17560183.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具