【问题标题】:c# abstract methods: internally public and virtual?c#抽象方法:内部公共和虚拟?
【发布时间】:2011-04-29 03:05:23
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为您提出的问题与大多数人的想法不同(换句话说,您似乎理解 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,就像方法不是抽象的一样。

    【讨论】:

    • 如果问题是“c# 中的抽象方法在内部是公共的还是虚拟的?”那么答案是“否”,默认情况下它们是“私有的”,因此如果不授予访问权限,则会产生编译错误。 C# 并没有粉饰一切,有时让我们工作,但即便如此,编译器错误消息也能很好地抓住我们的手。
    【解决方案2】:

    抽象只是一种表达方式:“我在这里,但还没有人告诉我我要做什么。”而且由于没有人实施该成员,但必须有人这样做。为此,您必须继承该类并覆盖该成员。

    为了能够覆盖某些东西,它必须声明为abstractvirtual,并且必须至少可供继承者访问,即必须标记为protectedinternalpublic

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        根据 Jon Skeet 的论点 (What are the Default Access Modifiers in C#?)

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

        它必须被“保护”

        正如 Pieter 指出的,默认始终是私有的,所以:

        abstract class Foo
        {
            abstract void Bar(); 
        } 
        

        给出编译错误

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

        【讨论】:

        • 抽象方法的默认修改也是私有的,就像任何其他方法一样。但是,因为这是非法的,所以省略修饰符会导致编译错误。
        • 天哪,这是真的:abstract class Foo { abstract void Bar();真的不会编译“虚拟或抽象成员不能是私有的”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多