c#抽象方法:内部公共和虚拟?

时间:2010-10-22 11:45:33

标签: c# abstract-class private public access-modifiers

抽象方法是内部公共的还是虚拟的c#?

默认情况下,所有方法都是私有的,如果抽象方法是私有的,则派生类将无法使用它,从而产生错误"virtual or abstract members cannot be private"

5 个答案:

答案 0 :(得分:12)

我认为你提出的问题与大多数人的想法不同(换句话说,你似乎明白abstract的意思)。

您无法声明私有抽象方法 - 编译器发出错误。这两个类都不会编译:

class Foo
{
    private abstract void Bar();
}

class Baz
{
    // This one is implicitly private - just like any other 
    // method declared without an access modifier
    abstract void Bah();
}

编译器阻止您声明无用的方法,因为私有抽象成员不能在派生类中使用,并且对声明类没有实现(因此没有用)。

值得注意的是,编译器应用于抽象成员的默认访问修饰符(如果您自己未指定)仍然是private,就像该方法不是抽象的一样。 / p>

答案 1 :(得分:4)

摘要只是一种说法:“我在这里,但没有人告诉我我将要做什么。”由于没有人实施该成员,但有人必须这样做。要做到这一点,你必须继承该类,并覆盖该成员。

为了能够覆盖它必须被声明为抽象或虚拟的东西,并且必须至少可以被继承者访问,即。必须标记受保护,内部或公共。

答案 2 :(得分:2)

抽象方法不能是私有的,而是虚拟的。它们必须至少受到保护。

答案 3 :(得分:2)

凭借Jon Skeet在这里的论证(What are the Default Access Modifiers in C#?

  

C#中所有内容的默认访问权限是“您可以为该成员声明的最受限制的访问权限”

必须“受保护”

正如Pieter所指出的那样,默认是私有的,所以:

abstract class Foo
{
    abstract void Bar(); 
} 

给出编译器错误

  

虚拟或抽象成员不能是私人的

答案 4 :(得分:1)

抽象方法是虚拟的,但它可以是公共的或受保护的。 (从技术上讲,它也可能是内部的,但我从未遇到过这种情况)