C#重载重写重构

前言

前几篇博客说了重写和重载,今天主要说重构,顺便比较一下三者。

重构、重写、重载

重构就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。通俗点说,重构,就是改善既有代码的设计,让代码更加的符合面向对象规则。

而重写是出现在多态里的,virtual关键字声明虚方法,子类通过override来实现方法重写。在父类里声明了一个模糊的方法,并不给出具体的行为,在子类里,通过重写父类中的这个方法,让这个方法实例化,去适合子类。

重载,通俗来讲,它的作用就是可以让我们的选择更多,比如在类中声明了一个方法,但是在我实际调用时,这个方法有时候符合我想要的,有时候不符合,就比如一个婴儿出生,父母可能在出生前就想好了婴儿的名字,也可能出生后也没有想好,如果只用构造函数的话,只有一个方法,不能满足我的要求,这时候就要用到方法重载,之前的的方法保留,再增加一个方法,接着这个例子,如果父母给婴儿娶了名字,那么,用原有的方法,如果没有取名字,就会用重载后的方法。

例子

先说重构的例子。

接着上次的比赛。现在又来了小牛和小羊报名叫声比赛,应该如何做呢?让我们先来看一下在多态中是怎么做的。

现在,完全可以再创建两个类,模仿狗和猫,继承Animal。其他除了叫声以外保持不变,这样,完成后,能很完美的运行,并且有我们想要的功能。

但是,没有错误不一定代表着优秀,我们发现,除了四种动物的叫声不同外,其他几乎没有任何差异,这就犯了重复的毛病。

既然有重复的,就要把重复的提取出来放到Animal中,但是,Animal是个抽象的类,没有具体的叫声,我们就把叫声部分改成另外一个方法:getShoutSound。接下来让我们来实现一下。

class Animal
{
    ……
    public string Shout()
    {
        string result = "";
        for (int i = 0; i < shoutNum; i++)
            result += getShoutSound() + ",";
        return "我的名字叫" + name + " " + result;
    }
    protected virtual string getShoutSound()
    {
        //“得到叫声”,虚方法,让子类重写,只需要给继承的子类使用,所以用protected修饰符。
        return "";
    }
}

这时候子类就非常简单了。比如,我们还让猫来叫。

class Cat : Animal
{
    public Cat():base()
    {}
    public Cat(string name):base(name)
    {}
    protected override string getShoutSound()
    {
        return "喵"
    }
}

其余几个动物都和猫一样,改下叫声就好了。虽然具体动物没有了Shout方法,但是它继承于Animal,Animal的Shout方法就可以被具体的动物继承,当然,外界也也可以调用具体动物的这个方法。

这就是重构,发现了之前的代码有错误,重复等,就重构代码,使其更为出色的完成功能。

总结

这篇博客,本来想直接写重构,但是,重构,重写,重载,都有个重字,更应该比较着去学习它们,简单来说,重构就是当你发现代码的不优之处时,去修改它的结构,去优化它。重写就是定义一个虚方法,子类去重写,它可以不同名,而重载必须是同名的,他相当于什么呢?我的理解就是,给你一个默认的方法,再给你一个其他方法,你可以使用默认的方法,也可以使用另外一个,但这两个方法名是相同的。

通过总结这篇博客,我发现对比学习能更好的促使我们去发现,去记忆一些东西,分享给大家。

时间: 2024-12-14 18:13:07

C#重载重写重构的相关文章

Java重载重写与实现方法的规则

这几天在实训过程中做到了一个题,这个题目问的是 非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头必须完全一致.这句话是错误的.然后在做错以后自己总结一下重载 重写 和实现的几个点. 重载:方法名一致即可,访问修饰符.返回值类型无关,然后不同的重载方法参数列表的参数的顺序,类型,数量进行变换即可. 重写:重写方法的访问修饰符可以不同,但访问权限需要比父类中的大,比如protected修饰的方法重写的时候可以重写为public类型.返回值类型可以是父类中方法返回值类型

C++基础6 【继承】 类型兼容 satatic 多继承 虚继承 【多态】 案例 虚析构函数 重载重写重定义

[继承] 继承的访问控制域 图 类型兼容性原则  指针 与 引用 用子类直接初始化父类 类的继承模型示意 图 [继承结论] [非常重要的概念] 继承与组合混搭情况下,构造和析构调用原则 原则:先构造父类,再构造成员变量.最后构造自己 先析构自己,在析构成员变量.最后析构父类 继承中,同名的成员变量的处理办法 继承中,同名的成员函数的处理办法 派生类中的static关键字 如果静态成员变量,你没有使用,也没有初始化的话 编译不会报错 经典错误 : 类中函数默认是private的,无法在外部访问 具

重载-重写(覆盖)-隐藏的区别

重载和重写搞的差不多了,隐藏有有点混乱了,在此记一下,留作后看 成员函数被重载的特征(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.重写(覆盖)是指派生类函数覆盖基类函数,--这是c++多态的标志,虚函数赋零则变成虚基类(纯粹的接口申明类),特征是(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下(1)如果派

java 方法的重载重写

面向对象有三大特性:封装,继承,多态 多态则需要满足三大条件1要有继承2要有重写3父类引用子类对象 很多人对方法的重载重写有很大疑问,下面我来介绍一下方法的重载重写 方法重载就是方法名称重复,加载参数不同 满足的条件: 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类型了! 2.如果参数个数相同,那么参数的类型必须不同. 三.方法的返回类型.修饰符可以相同,也可不同. class MethodOverloadi

重载重写重定义

1.重载:overload,是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. class Overload{ public: void V1(int i); void V1(double i); void V1(int i, double j); void V1(double i, int j); int test(int i); //编译报错,不是重载 }; 2.隐藏(重定义):隐藏是指派生类的函数屏

重载重写隐藏

1. 重载:在相同作用域中,同名函数但参数列表不同,编译器将参数列表同函数名拼接在一起形成不同的符号,所以说重载必须参数列表不同,而不考虑返回类型.C++函数重载实现原理浅析. 2. 重写:父类虚函数与子类函数同名同参数列表,则为重写. 3. 隐藏:父类非虚函数与子类函数同名时,则父类非虚函数被隐藏,即使参数列表不同.

java——阶段性整理(方法的重载重写和一些关键字)

一.方法的重载和方法的重写 重载:overload,同一给类中方法名相同,参数不同.作用:一种行为提供多种实现方式并提高可读性. 重写:override,子类继承父类的方法,内容不同.作用:父类方法无法满足子类的要求,子类通过方法重写满足要求 二.简述static关键字的作用. static可以修饰变量.方法.代码块和内部类,分别称为静态变量,静态方法,静态代码块和静态内部类. 1)静态遍历属于这个类所有,即由该类创建的所有对象共享同一个static变量. a)不管有多少个对象,静态变量只有一份

C++重载重写和多态区别

1.重载和重写的区别: 重载overload:在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态. 重写override:也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态. 重定义redefining

重载重写与重定义

重载:重载是指在一个类或者作用域中可以出现多个函数名相同参数不同的函数,重载可以分为函数重载和运算符载 函数重载实例: #include <iostream> using namespace std; //比较两个int型数的大小,并且返回最大的数 int max(int a, int b) { int c; c = (a > b) ? a : b; return c; } //比较两个double型数的大小,并且返回最大的数 double max(double a, double b)