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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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();真的不会编译“虚拟或抽象成员不能是私有的”

以上是关于c#抽象方法:内部公共和虚拟?的主要内容,如果未能解决你的问题,请参考以下文章

C#中的抽象类和抽象方法

为啥 C# 接口方法没有声明为抽象或虚拟的?

抽象类中的私有非抽象成员和继承 C#

数据抽象

覆盖另一个程序集中的内部抽象方法

Java15-java语法基础(十四)抽象类