【发布时间】:2011-04-29 03:05:23
【问题描述】:
c# 中的抽象方法在内部是公共的还是虚拟的?
默认情况下,所有方法都是私有的,如果抽象方法是私有的,派生类将无法使用它,从而产生错误"virtual or abstract members cannot be private"
【问题讨论】:
标签: c# abstract-class private public access-modifiers
c# 中的抽象方法在内部是公共的还是虚拟的?
默认情况下,所有方法都是私有的,如果抽象方法是私有的,派生类将无法使用它,从而产生错误"virtual or abstract members cannot be private"
【问题讨论】:
标签: c# abstract-class private public access-modifiers
我认为您提出的问题与大多数人的想法不同(换句话说,您似乎理解 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,就像方法不是抽象的一样。
【讨论】:
抽象只是一种表达方式:“我在这里,但还没有人告诉我我要做什么。”而且由于没有人实施该成员,但必须有人这样做。为此,您必须继承该类并覆盖该成员。
为了能够覆盖某些东西,它必须声明为abstract 或virtual,并且必须至少可供继承者访问,即必须标记为protected、internal 或public。
【讨论】:
抽象方法不能是私有的并且是虚拟的。它们至少必须受到保护。
【讨论】:
根据 Jon Skeet 的论点 (What are the Default Access Modifiers in C#?)
C# 中所有内容的默认访问权限是“您可以为该成员声明的最受限制的访问权限”
它必须被“保护”
正如 Pieter 指出的,默认始终是私有的,所以:
abstract class Foo
{
abstract void Bar();
}
给出编译错误
虚拟或抽象成员不能是私有的
【讨论】: