C# 是否可以重写同一类(不是派生类)中基类中的方法?

C# 是否可以重写同一类(不是派生类)中基类中的方法?,c#,.net,asp.net,oop,C#,.net,Asp.net,Oop,我的理解是,可以使用关键字Override从派生类重写基类中的方法(标记为Virtual) 但是重写同一类中的方法怎么样? 在我的具体例子中,我有一个类x,包含两个方法。方法a与b有一些共同的行为,并且b向方法a添加了功能 public class x { public static void a() {} public static void b() {} } 过去,我在b中复制了a的代码,并在b中添加了新功能 我想知道是

我的理解是,可以使用关键字
Override
从派生类重写基类中的方法(标记为
Virtual

但是重写同一类中的方法怎么样?

在我的具体例子中,我有一个类
x
,包含两个方法。方法
a
b
有一些共同的行为,并且
b
向方法
a
添加了功能

    public class x
    {
       public static void a() {}
       public static void b() {}         
    }
过去,我在
b
中复制了
a
的代码,并在
b
中添加了新功能

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

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

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

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

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

您可以根据需要在b中任意多次调用a。

您只需在方法中调用方法
a()
。不需要(也没有办法)重写方法

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()
,结果相同。

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

为什么不直接从
b()
调用
a()


如果我理解正确的话,您的问题是方法b与方法a的代码相同,再加上一些代码。差不多

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
    }
}
以及重写同一类中的方法。它被调用,但它可以让您创建几个名称相同的方法,这些方法在输入类型方面彼此不同

像这样

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

    public string a(string s)
    {
    }
}
唯一的限制是方法必须具有相同的返回类型(本例中为字符串)

根据我的理解,可以使用关键字Override从派生类重写基类中的方法(标记为Virtual)。但是同一个类中的同一个重写方法又如何呢

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

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

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添加功能

只需从
b()
调用
a()


谢谢Merlyn的评论,我对你的留言投了赞成票。。这有助于我的理解thanks@GibboK:你可能还想看看《计算机程序的结构和解释》一书。它的主要目的是教您如何分解代码。它使用Lisp,但它所教授的每一个概念都直接适用于任何现代语言。这本书也在网上免费发行。网上还有一个免费的视频系列,内容(或多或少)相同。
public class x
{
   public static void a()
   {
       // "base" implementation here
   }

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