2013-06-21 117 views
0

在我的C#應用​​程序中,我有一個基類,它包含一個函數Myfunction。 我有一個從上面的基類派生類,它也包含基類中的相同函數,這個概念是正確的實現嗎?方法重載或重寫方法?

public class BaseClass 
{ 
    public void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 


public class DerivedClass:BaseClass 
{ 
    public void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 

我爲我的英語

回答

5

你實際上已經hiddenBaseClass.MyFunction通過這樣做。

如果你要正確地覆蓋,您必須聲明的基礎版本virtual(或abstract),然後指定override

public class BaseClass 
{ 
    public virtual void MyFunction() { } 
} 

public class DerivedClass:BaseClass 
{ 
    public override void MyFunction() { } 
} 

超載和壓倒一切的是不同的東西。以上顯示覆蓋。重載是指有多個名稱相同但參數不同的方法。例如。如果你有這些方法:

public void MyFunction(int i) {} 
public void MyFunction(decimal d) {} 

你會說,有兩個重載的MyFunction

+0

「這樣做實際上隱藏了BaseClass.MyFunction。」 - 不,沒有'new'關鍵字... OP的代碼不會編譯。 –

+0

@JimBalter它編譯時會出現警告,除非添加'new'。 – Blorgbeard

+0

我的錯誤。它*應該*是一個錯誤;它不是爲了向後兼容。 –

2

沒有在編程一個newbee,對不起,這是不對的實施method overloading

如果創建同名的方法,以及相同的參數那麼這將是method overriding

如果創建同名的方法,但不同的參數那麼這將是method overloading

如果你需要實現你的method overriding例如,然後在你的derived class method添加override關鍵字並添加virtual關鍵字與base class method

public class BaseClass 
{ 
    public virtual void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 


public class DerivedClass:BaseClass 
{ 
    public override void MyFunction() 
    { 
     Console.WriteLine(""); 
    } 
} 

如果你想實現的overloading一個例子,那麼你只需要更改兩種方法的參數。變化意味着他們必須彼此不同。例如:

public class BaseClass 
    { 
     public void MyFunction() 
     { 
      Console.WriteLine(""); 
     } 
    } 


    public class DerivedClass:BaseClass 
    { 
     public void MyFunction(string input) 
     { 
      Console.WriteLine(""); 
     } 
    } 
+0

「覆蓋類」 - 不,這是不言而喻的方法。另外,你對超載的討論有點偏離;重載的方法通常在同一個類中;在不同的類中有重載是一種代碼異味。 –

+0

@JimBalter輸入錯誤..你是對的,他們通常在同一個班級。但是在這裏我修改了他給出的示例,所以他可以更好地理解 – Shaharyar

+0

爲了更好地理解,請將最後一個更改爲「控制檯」。WriteLine(input)'(實際上,我會把它放在基類中,並且在派生類中有'MyFunction(){MyFunction(「」);}')。 –

0

在此示例中,DerivedClass中的MyFunction覆蓋BaseClass中的MyFunction。

如果您有另一個MyFunction,這次'MyFunction(int parameter)',您將會重載MyFunction。

+0

「在這個例子中,DerivedClass中的MyFunction覆蓋了BaseClass中的MyFunction。」 - 不,不是,這是一個錯誤。 C#在派生類中需要'new'關鍵字,或者在派生類中需要''virtual''和'override'。 –

+0

糟糕,我的錯誤,這只是一個警告。但在任何健康的商店中,這些警告都是不允許的。 –

0

你必須重載/ overrieds方法,用這種方法

public class derived_Class : mybaseclass 
    { 

     public override void mymethod() 
     { 
      // IF you want to call the base class function as well then you call base.mymethod() ; 
      base.mymethod(); 
     } 


    } 

    class mybaseclass 
    { 

     // When you want to overide a method , you must use Virtual keyword 
     public virtual void mymethod() 
     { 

     } 

     // This is an overload of overload_method 
     // when you write many methods from same name with different arguments, it's an overload of the method 
     public void overload_method() 
     { 
     } 
     public void overload_method(string m) 
     { 

     } 

     // When you use an overload 
     public void use() 
     { 
      overload_method(); 
      overload_method(null); 
     } 
    }