首页 > 编程语言 >Learning hard C#学习笔记——读书笔记 03

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

时间:2023-07-17 15:26:01浏览次数:50  
标签:03 Horse 读书笔记 C# value public Animal 基类 class

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

所有面向对象的编程语言都有以下三个基础特征

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

1.封装


封装是把类的内部数据隐藏,不让对象实例直接对齐操作,C# 提供属性机制来对内部的状态进行操作,在 C# 中封装可以通过public、private、protected、internal等关键字来体现

为什么要进行封装呢?

封装是一种程序内部的保护机制,保护数据的完整性,

例如:我定义一个人的类,创建了它的对象,将其内部的age属性赋值为 -5 ;但是我们都知道,人的年龄是没有-5的,这种随意的赋值,就破坏了数据的完整性

解决上面的情况,就需要使用下面的这种方式

public class Person 
{
    private string _name;
    private int _age;
  
    public string Name {
        get { return _name; }
        set { _name = value; }
    }
  
    public int Age {
        get { return _age; }
        set { 
            if(value < 0 || value > 120) 
            {
                throw(new ArgumentOutOfRangeException("AgeIntPropery",value,"年龄必须在0~120之间"));
            }else {
                _age = value;
            }
        }
    }
}

2.继承


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

为什么需要继承呢?

继承的作用主要是为了复用基类的内容,但是继承也有自己的缺点,就是耦合性太大,要结合场景来使用


class Program 
{
    static void Main(string[] args)
    {
        Horse horse = new Horse();
        horse.Age = 2;
  
        Sheep sheep = new Sheep();
        sheep.Age = 1;
        Console.WriteLine("羊的年龄:{0}",sheep.Age);
        Console.Read();
     }
}

public 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 class Horse:Animal{}

public class Sheep:Animal{}

2.1 密封类

密封类不能被另外一个类继承,如果强行继承,就会编译错误

public sealed class SealedClass
{
    // 在这里定义类成员
}

// 下面的代码会编译错误
public class Test:SealedClass{
}

2.2 子类初始化的顺序


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

  1. 初始化类的实例字段
  2. 调用基类的构造函数,如果没有指明基类,则调用System.Object构造函数
  3. 调用子类的构造函数

class Program 
{
    static void Main(string[] args)
    {
        Horse horse = new Horse();
        horse.Age = 2;
  
        Sheep sheep = new Sheep();
        sheep.Age = 1;
        Console.WriteLine("羊的年龄:{0}",sheep.Age);
        Console.Read();
     }
}

public class Animal
{
    // 2.初始化基类的成员变量
    private int _age;
    public int Age
    {
        get { return _age; }
        set 
        {
            if(value < 0 || value > 10)
            {
                throw (new ArgumentOutOfRangeException("AgeIntProperty",value,"年龄必须在0-10之间"));
            }
            _age = value;
        }
    }

    // 3.调用基类的构造
    public Animal() {

    }
}

public class Horse:Animal{
    // 1.先初始化
    private string run;

    // 4.调用子类构造
    public Horse() {

    }  
}

public class Sheep:Animal{
    private string eat;
  
    public Sheep() {

    }
}

3.多态

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


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


只有基类声明为 virtual 或 abstract 时,才可以被派生类重写;而子类想要改变虚方法的实现行为,只能使用override关键字

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("

标签:03,Horse,读书笔记,C#,value,public,Animal,基类,class
From: https://www.cnblogs.com/trueasureyuki/p/17560183.html

相关文章

  • 自定义CANoe工程——按键控制后备箱开关
    工程文件地址:C:\Users\Public\Documents\Vector\CANoe\Projects\TrunkOpen1.新建数据库,需要有一个节点Trunk,一个报文TrunkOpen,报文上的信号为OpenOrClose。定义好这些以后不要忘了以下几点:信号要关联到它的对应报文;报文由哪个节点发送,具体在哪如下图所示;添加节点在建立数据......
  • 苹果年度跳水王!M2版Mac mini降到3059元 发售价4499元
    虽然前不久苹果上线了2023款Macmini翻新机,但是M2版本售价高达3819元,远超市场价。这导致官翻机爆冷,很少有用户下单。有意思的是,在第三方电商平台,M2版Macmini的价格则一降再降,如今在拼多多百亿补贴万人团中,售价仅需3059元。对比官网原价的4499元,降价幅度达到1440元,最关键的是......
  • 一文带你理解AST Injection
    模版引擎是什么JSweb开发中常用的模版引擎如 ejs、pug、handlebars功能:动态渲染HTML代码,创建可重复使用的页面结构ejs 模版使用//安装EJS模块:npminstallejs//引入EJS模块constejs=require('ejs');//定义模板consttemplate=`<h1>Hello,<%=name%>!</h1......
  • net core-反向代理
    推荐使用框架:Yarp.ReverseProxy,微软开源的框架一基本使用varbuilder=WebApplication.CreateSlimBuilder(args);builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));varapp=builder.Build();app.MapRevers......
  • Learning hard C#学习笔记——读书笔记 02
    每每说到类,不得不介绍的就是类的定义,它是一个抽象的概念,它是一个模板,制造对象的模板1.定义一个类classPreson{//类的成员变量}默认情况下,class关键字没有显式的使用internal修饰符来定义类,但是没有必要这样做,默认的修饰符就是internal除了internal这个权限修饰......
  • Codeforces Round #885(Div. 2)C
    C.维卡和价格标签每个测试的时间限制为1秒每个测试的内存限制为256兆字节输入:标准输入输出:标准输出维卡来到她最喜欢的化妆品店"GoldenPear"。她注意到n个物品的价格自她上次光顾以来发生了变化。她决定分析价格的变化,并计算每个物品的旧价格和新价格之间的差异。维卡喜......
  • 泛微ecology FileDownloadForOutDoc-前台sql注入
    厂商发布漏洞补丁Ecology_security_20230707_v9.0_v10.58.0.ziphttps://www.weaver.com.cn/cs/package/Ecology_security_20230707_v9.0_v10.58.0.zip?v=2023070700分析补丁文件ecology\WEB-INF\myclasses\weaver\security\rules\ruleImp\SecurityRuleForOutDocForSql.class......
  • ElasticSearch安装中文分词器(插件)、分词测试
    https://github.com/medcl/elasticsearch-analysis-ik分词测试:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/indices-analyze.html请求URL:http://127.0.0.1:9200/_analyze请求方式:POST请求体/类型(JSON):{"analyzer":"ik_max_word",......
  • ElasticSearch-Mapping类型映射-增删改查
    https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping.html7.x版本后默认都是_doc类型增加Mapping映射先说一个特殊的字段_all:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping-all-field.html#mapping-all-field_all字段是一个特......
  • ArcEngine调用GP工具(含界面)
    GP工具是ArcGIS的精髓。在开发时,可以通过调用所有系统的GP,也可以调用自定义的GP。除此外,居然也可以直接调用GP工具的界面。操作方法如下:privatevoidbutton1_Click(objectsender,EventArgse){//创建GPToolCommandHelper对象IGPToolCommandHelper2gpToolCommand......