方法重载或方法覆盖?

时间:2013-06-21 04:04:12

标签: c# oop

在我的C#应用​​程序中,我有一个基类,它包含一个函数Myfunction。 我有一个来自上面的基类的派生类,它也包含与基类相同的函数,这个概念是否正确实现?

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


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

我是编程的新手,对不起我的英文

4 个答案:

答案 0 :(得分:5)

你这样做实际上是hidden BaseClass.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有两个重载

答案 1 :(得分:2)

不,这是method overloading的错误实施。

如果您使用同名相同参数创建方法,则它将为method overriding

如果您使用同名创建方法,但不同参数,那么它将为method overloading

如果您需要为method overriding实施示例,请在override上添加derived class method关键字,并在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("");
        }
    }

答案 2 :(得分:0)

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

如果你有另一个MyFunction,这次是'MyFunction(int参数)',你就会重载MyFunction。

答案 3 :(得分:0)

你必须以这种方式重载/覆盖方法

   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); 
        } 
    }