C# 在同一类中是否可以重写函数?

C# 在同一类中是否可以重写函数?,c#,oop,overriding,C#,Oop,Overriding,这是一种客观问题类型,但在同一类中是否可以重写函数?一般来说,准确地说,是C。如果可能的话,如何以及何时使用它?刚刚测试过。 类本身不会给编译器显示错误甚至警告的理由,但当调用函数时,编译器会显示: 以下方法或属性之间的调用不明确: “方法1”和“方法2” 从语法上讲,使用标准方法是不可能的。但实际上,您可以通过更改委托(更接近于自己的方法)来实现这一点。但这离通过对象、助手(通过接口联系人提供服务)改变行为已经不远了,后者更灵活 class Test1 { public virtual

这是一种客观问题类型,但在同一类中是否可以重写函数?一般来说,准确地说,是C。如果可能的话,如何以及何时使用它?

刚刚测试过。 类本身不会给编译器显示错误甚至警告的理由,但当调用函数时,编译器会显示:

以下方法或属性之间的调用不明确: “方法1”和“方法2”


从语法上讲,使用标准方法是不可能的。但实际上,您可以通过更改委托(更接近于自己的方法)来实现这一点。但这离通过对象、助手(通过接口联系人提供服务)改变行为已经不远了,后者更灵活

class Test1
{
    public virtual void Test2() {

    }

    public override void Test2() {

    }
}
给你一个编译错误。所以,不,这是不可能的。

这是来自C语言规范

被重写声明重写的方法称为 重写的基方法。对于类中声明的重写方法M C、 重写的基方法是通过检查每个基来确定的 类类型C,从直接基类类型C开始,然后 继续使用每个连续的直接基类类型,直到 给定基类类型,至少有一个可访问的方法位于 替换类型参数后具有与M相同的签名。对于 为了定位被重写的基本方法,方法是 如果是公共的,如果是受保护的,如果是 受保护的内部,或者如果它是内部的并且在同一个 程序名为C

编译时错误会发生,除非以下所有条件对于 覆盖声明:

  • 可以如上所述定位重写的基本方法

  • 只有一个这样被重写的基方法。此限制仅在基类类型为构造类型且 类型参数的替换使两个方法的签名成为 一样

  • 重写的基方法是虚拟、抽象或重写方法。换句话说,重写的基方法不能是静态的或静态的 非虚拟的

  • 重写的基方法不是密封方法

  • 重写方法和重写的基方法具有相同的返回类型

  • 重写声明和重写的基方法具有相同的已声明可访问性。换句话说,重写声明 无法更改虚拟方法的可访问性。然而,如果 重写的基方法受内部保护,并在 与包含替代方法的程序集不同的程序集 然后必须保护重写方法声明的可访问性

  • 重写声明未指定类型参数约束子句。相反,约束条件是 从重写的基方法继承。请注意,约束 重写方法中的类型参数是否可以替换为类型 继承约束中的参数。这可能导致约束 显式指定时不合法的,例如值类型或 密封类型

因此不可能,重写修饰符用于扩展基类方法,而不是用于在当前类中隐藏方法定义


例如,在方法被替代后,面试官可能会对方法选择感到困惑。

你不能。根据定义(从):需要重写修饰符来扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现

不能继承类本身()的属性,因此不能在同一个类中重写

有一件事接近重写,您可以做的就是方法重载

public class A
{
    void methodA()
    {
        //something here
    }

    void methodA(int i)
    {
        //something else here
    }
}

看起来它无法被覆盖。然而,我确实看到了它的用处。例如,如果要手动重写机器生成的代码。

为什么首先要这样做?重写同一类中的方法与更改方法是一样的。我认为没有办法,也不需要这样做,但是,如果要将方法签名与实现分离,有部分的方法,但我不建议使用这个,除非它是绝对必要的。很可能是重载而不是重写。您/他们是指从基类重写还是重载同一类中的方法?