Fighting Ant

Ant can be great while elephant can be chickenshit

导航

重载和重写

Posted on 2008-06-10 17:32  Nillson  阅读(652)  评论(1编辑  收藏  举报

重载和重写无论在叫法上还是在实际用途上都有容易混淆的地方,写出来自己的理解也有助于区分。
重载发生在同一个类中 这一点很重要。重载主要是针对同一个类中方法名相同但参数(必须的)不同或返回类型(不是必须的)不同的情况。可以参照如下的代码

class OverLoadTest
    
{
        
public void Hello()
        
{
        }

        
public void Hello(string str)
        
{
        }

        
public string Hello()
        
{
        }

    }
在这段代码中有三个具有相同名称的方法Hello,他们彼此之间是重载的关系,注意两点:他们共同存在于一个类中,虽有同样的名字但是执行不同的操作;第一个方法和第三个方法只有返回类型不同,这在C# 中是不允许的,编译器会报出“已定义一个名为"Hello"的方法”的错误。
重写发生在有继承关系的类之间 这一点也很重要。重写发生在派生类上,通过override关键字来改写从其父类继承过来的具有相同返回值,方法名称和参数列表的方法。
    class Program
    
{
        
static void Main(string[] args)
        
{
            OverWriteTestTT owTT 
= new OverWriteTestTT();
            owTT.Hello();
            overWriteTestTTT owTTT 
= new overWriteTestTTT();
            owTTT.Hello();
        }

    }

    
class OverWriteTest
    
{
        
//Over write the method ToString();
        public override string ToString()
        
{
            
return "hello world";
        }

        
//Define a virtual method Hello() to be over written
        public virtual void Hello()
        
{
            Console.WriteLine(
"hello");
        }

    }

    
class OverWriteTestTT : OverWriteTest
    
{
        
//Over write the method Hello() of OverWriteTest
        public override void Hello()
        
{
            Console.WriteLine(
"No hello world");
        }

    }

    
class overWriteTestTTT : OverWriteTestTT
    
{
        
//Over write the method Hello() of class OverWriteTestTT
        public override void Hello()
        
{
            
base.Hello();
            Console.WriteLine(
"NNo hello world");
        }

    }

上面这段代码演示了如何对父类的方法进行重写,需要注意的地方有两点:可以在子类中被重写的方法一定要被标记成virtual(虚拟), abstract(抽象), override(重写)标记为virtual 和abstract 的函数就是为了重写而创建的,标记为override的函数本身是由前两种函数重写而来的,所以它可以被重写也是顺理成章的了;重写的函数必须在子类中出现,而且任何一个父类的函数在其一个子类中只能被重写一次。(这一点很好理解,当你要重写两次时,该子类中将定义两个返回类型,方法名称 和参数列表都相同的函数,这肯定是不可能的)。
所以如果在父类中定义了一个方法habit(),重载讲述的是父亲本人习惯的事,例如爱抽烟爱喝酒等等,但是重写则讲述的是儿子继承父亲习惯的问题,例如父亲抽的是大前门,儿子抽的是中南海,父亲喝的是二锅头,儿子喝得是剑南春了.......