是否可以覆盖同一类(不是派生类)中的基类中的方法?

时间:2011-06-09 07:46:08

标签: c# .net asp.net oop

我的理解是,可以使用关键字Virtual从派生类覆盖基类中的方法(标记为override)。

但是如何覆盖同一个类中的方法呢?

在我的具体情况中,我有一个类x,有两种方法。方法ab有一些共同的行为,b为方法a添加了功能。

过去,我在a中复制了b的代码,并将新功能添加到b中。

我想知道是否有更好的方法,以便集中方法a的行为。

    public class x
    {
       public static void a() {}
       public static void b() {}         
    }

6 个答案:

答案 0 :(得分:11)

您只需在方法a()中调用方法b()即可。不需要(也没办法)覆盖方法。

public class x
{
   private static int _i = 0;

   public static void a() {
       _i = 1;
   }
   public static void b() {
       a();
       // here is _i = 1;
   }         
}

另一方面,您的方法可能会有参数重载

public class x
{
   private static int _i = 0;

   public static void a() {
       a(1);
   }
   public static void a(int i) {
      _i = t;
      // common code which can use _i
   }         
}

在这种情况下,您可以使用相同的结果来致电a(1)a()

答案 1 :(得分:9)

您不能在同一个类中覆盖,只能在派生类中执行此操作。您可以将方法的常见行为放在方法a中,然后从方法b中调用它。

public static void a() 
{
// some common functionality
}

public static void b()
{
// do something
a(); //call a
//do something else
}

您可以根据需要多次在b内拨打电话。

答案 2 :(得分:3)

  

根据我的理解,可以使用关键字覆盖从派生类覆盖基类中的方法(标记为虚拟)。但是在同一个类中覆盖一个方法呢?

你不能这样做。虚拟方法适用于Polymorphism,这是一种奇特的说法:

如果你编写一个接受基类的方法,并将它传递给派生类,并且该方法在基类上调用一个方法,它将实际调用派生的实现。

class A
{
    public virtual void DoSomething() { Console.WriteLine("From A"); }
}

class B : A
{
    public override void DoSomething() { Console.WriteLine("From B"); }
}

class C
{
    public void DoSomethingMagic(A someClassInstance)
    {
        someClassInstance.DoSomething();
    }
}

class Program
{
    public static void Main(string[] args)
    {
        A a = new A();
        B b = new B();
        C c = new C();
        c.DoSomethingMagic(a); // Prints "From A"
        c.DoSomethingMagic(b); // Prints "From B", even though it takes an A

        A bIsAnA = new B();
        c.DoSomethingMagic(bIsAnA); // Prints "From B", because B is also an A
    }
}

根据该定义,尝试“覆盖”同一类中的方法是没有意义的。

  

在我的特定情况下,我有一个带有2个方法的类x,方法a作为b的一些常见行为,b为方法a添加功能。

只需从a()致电b()

public class x
{
   public static void a()
   {
       // "base" implementation here
   }

   public static void b()
   {
       a();
       // extra implementation here
   }
}

答案 3 :(得分:2)

为什么不从a()致电b()

public static void b()
{
    // Do some stuff
    a(); // Do the common stuff
    // Do more stuff
}

答案 4 :(得分:1)

您将公共部分拆分为第三个共享但私有的方法。

答案 5 :(得分:1)

如果我理解正确你的问题是方法b具有与方法相同的代码加上一些代码。像

这样的东西
public class x
{
    public void a()
    {
        // a code
    }

    public void b()
    {
        // a code

        // b code
    }
}

如果是这种情况,你可以在方法b中像这样调用方法a

class x
{
    public void a()
    {
        // a code
    }

    public void b()
    {
        a();

        // b code
    }
}

另一种情况是你有两种方法的通用代码:

class x
{
    public void a()
    {
        // common code

        // a exclusive code
    }

    public void b()
    {
        // common code

        // b exclusive code
    }
}

然后你可以将代码提取到另一个方法:

class x
{
    public void a()
    {
        CommonMethod();

        // a exclusive code
    }

    public void b()
    {
        CommonMethod();

        // b exclusive code
    }

    private void CommonMethod()
    {
        // common code
    }
}

关于覆盖同一类中的方法。它被称为method overloading,但它的工作原理允许您创建多个具有相同名称的方法,这些方法在输入类型方面彼此不同。

喜欢这个

class x
{
    public string a(int i)
    {
    }

    public string a(string s)
    {
    }
}

唯一的限制是方法必须具有相同的返回类型(本例中为字符串)。