c # абстрактные методы: внутренне общедоступные и виртуальные? - PullRequest
8 голосов
/ 22 октября 2010

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

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

Ответы [ 5 ]

12 голосов
/ 22 октября 2010

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

4 голосов
/ 22 октября 2010

Аннотация - это просто способ сказать: «Я здесь, но никто не сказал мне, что я собираюсь делать».И поскольку никто еще не внедрил этот член, кто-то должен это делать.Чтобы сделать это, вы должны унаследовать этот класс и переопределить этот член.

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

2 голосов
/ 22 октября 2010

В силу аргумента Джона Скита здесь ( Что такое модификаторы доступа по умолчанию в C #? )

Доступ по умолчанию ко всему в C # "наиболееограниченный доступ, который вы могли бы объявить для этого члена "

Он должен быть" защищен "

Как указано Pieter, по умолчанию всегда конфиденциально, поэтому:

abstract class Foo
{
    abstract void Bar(); 
} 

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

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

2 голосов
/ 22 октября 2010

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

1 голос
/ 22 октября 2010

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

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