2010-10-22 3 views
7

Являются ли абстрактные методы внутренне общедоступными и виртуальными в C#?C# абстрактные методы: внутренние и виртуальные?

Все методы по умолчанию, частным и если абстрактный метод является частным, он не будет доступен для производного класса, что дает ошибку "virtual or abstract members cannot be private"

ответ

11

Я думаю, что вы просите другой вопрос, чем большинство людей думают (другими словами, кажется, что вы понимаете, что такое 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, как если бы этот метод не был абстрактным.

+0

+1 для наиболее полного ответа до сих пор. –

+2

Если вопрос "являются абстрактными методами, общедоступными и виртуальными в C#?" Тогда ответ «нет», они «закрыты» по умолчанию и поэтому будут выдавать ошибку компиляции, если не предоставляется доступ. C# не сахарирует все и заставляет нас работать иногда, но даже тогда сообщения об ошибках компилятора делают довольно хорошую работу, держась за руку. – Les

1

Абстрактный метод является виртуальным, но он может быть открытым или защищенным. (технически он также может быть внутренним, но я никогда не встречал такого случая)

+0

Что такое абстрактный метод bu по умолчанию, мы должны указать модификатор, как открытый или защищенный. – NoviceToDotNet

+1

Любой метод является закрытым по умолчанию, поэтому в итоге вы получите ошибку компиляции, если вы опустите определение области абстрактного метода. –

+1

Абстрактный метод по умолчанию не имеет значения, он существует, но вы не можете его выполнить, и вы не можете создать экземпляр класса. Вы должны наследовать класс, и в этом классе переопределить абстрактный метод. – Onkelborg

2

Абстрактные методы не могут быть частными и виртуальными. Они должны быть, по крайней мере, защищены.

4

Реферат - это просто способ сказать: «Я здесь, но никто не сказал мне, что я собираюсь делать». И так как никто не реализовал этого члена, кто-то должен это сделать. Для этого вам нужно наследовать этот класс и переопределить этот элемент.

Чтобы иметь возможность переопределить что-то, оно должно быть объявлено как абстрактным, так и виртуальным, и должно быть, по крайней мере, доступно для наследника, т.е. должны быть отмечены как защищенные, внутренние, так и общедоступные.

+0

+1 для вашего кристально чистого ответа. –

2

В силу аргумента Джона Скита здесь ( What are the Default Access Modifiers in C#?)

доступа по умолчанию все в C# является «наиболее ограниченный доступ можно объявить для этого члена»

Это должно быть «защищенный»

Как отметил Питер по умолчанию всегда частная, так:

abstract class Foo 
{ 
    abstract void Bar(); 
} 

дает ошибку компилятора

виртуальные или абстрактные члены не могут быть частными

+2

Значение по умолчанию для абстрактных методов также является приватным, как и любой другой метод. Но, поскольку это незаконно, оставление модификатора дает ошибку компиляции. –

+0

О, дорогая, это так верно: абстрактный класс Foo {abstract void Bar(); } действительно не компилирует «виртуальные или абстрактные члены не могут быть частными» – veggerby

 Смежные вопросы

  • Нет связанных вопросов^_^