重载和重写

学UML时就开始接触面向对象思想,为什么要学习面向对象呢?因为它像活字印刷术一样,具有可维护、可复用、可扩展、灵活性好等几大优点。

说到面向对象,不得不提到重载和重写。它俩很相似,以致很长一段时间都不能区分它们。昨晚,经过自己的挑灯夜战,终于对它两有了一个进一步了解,在此把心得和大家分享一下。

先说重载,重载要求两个方法名必须相同,但参数类型或个数必须有所不同。这么说有点抽象,举个例子吧。我们建立一个“猫”的类,在这个类中构建两个方法,一个是带参数姓名的方法,一个是不带参数姓名的方法:

 

[html][/html] view plaincopy

  1. Public Cat(string name)
  2. {
  3.     this.name=name;
  4. }
  5. Public Cat()
  6. {
  7.     this.name=”无名”;
  8. }

 

这样,当我们初始化一个“猫”的对象时,就可以根据自己需要,给对象起名或者不起名,达到扩展性功能。

再说重写,重写一般和多态联系在一起。它要求方法名、参数列表返回值类型必须相同,还是用例子来说明问题吧!

比如动物都有“叫”的方法,猫和狗都是它的子类,猫的叫声是“喵”,狗的叫声是“旺”。面对这种问题怎么实现呢,首先我们在动物类中构建一个虚方法:

 

[html][/html] view plaincopy

  1. Class Animal
  2. {
  3.     Public virtual string Shout()
  4.     {
  5.         return “”;
  6.         }
  7. }

 

在构建猫类时我们重写“叫”这个方法

[html][/html] view plaincopy

  1. Class Cat:Animal
  2. {
  3.     Public override string Shout()
  4.        {
  5.        String result=”喵”;
  6.            return result;
  7.         }
  8. }

在构建狗类方法时,我们也重写“叫”这个方法

 

[csharp][/csharp] view plaincopy

  1. Class Dog:Animal
  2. {
  3.        Public override string Shout()
  4.        {
  5.        String result=”旺”;
  6.            return result;
  7.         }
  8. }

 


这个我们就实现了面对同一方法,不同对象产生不同的效果,实现了多态的功能。

重载一个发生在一个类中,重写一个发生在父类和子类之间,声明的是父类,实例化的是子类,既儿子以父亲的身份出现,在工作时以儿子的方法完成父亲的任务。

标签