2013-06-21 119 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); 
     } 
    }