Наследование C#

Мне очень нравится версия документа Python, предложенная tzot и JFSebastian, но у нее есть два недостатка:

  • она не очень ясна
  • Я обычно не хочу значение заполнения в последнем чанке

Я часто использую это в своем коде:

from itertools import islice

def chunks(n, iterable):
    iterable = iter(iterable)
    while True:
        yield tuple(islice(iterable, n)) or iterable.next()

ОБНОВЛЕНИЕ: версия ленивых чанков:

from itertools import chain, islice

def chunks(n, iterable):
   iterable = iter(iterable)
   while True:
       yield chain([next(iterable)], islice(iterable, n-1))
5
задан Tom Juergens 20 October 2009 в 21:08
поделиться

5 ответов

По умолчанию методы в C # запечатаны. Однако вы ничего не можете сделать , чтобы предотвратить скрытие метода (выставление метода с тем же именем в производном классе, обычно с new ).

Или для этого имеет значение, повторная реализация интерфейса:

static void Main()
{
    ISomeInterface si = new EvilClass();
    si.DoSomething(); // mwahahah
}

public class EvilClass : ASomeAbstractImpl, ISomeInterface
{
    public override void A() {}
    public override void B() { }
    void ISomeInterface.DoSomething()
    {
        Console.WriteLine("mwahahah");            
    }
}
9
ответ дан 13 December 2019 в 19:33
поделиться

По умолчанию все методы запечатаны, но невозможно предотвратить скрытие элементов.

Компилятор C # выдает предупреждение компилятора всякий раз, когда вы скрываете член, но кроме этого, вы не можете предотвратить это.

2
ответ дан 13 December 2019 в 19:33
поделиться

Метод, не помеченный как виртуальный , по умолчанию запечатан. В производном классе вы должны пометить «замещающий» метод ключевым словом new , иначе вы получите предупреждение компилятора. Если метод суперкласса отмечен как виртуальный, вы можете запечатать его в соответствии с запечатанным переопределением .

http://msdn.microsoft.com/en-us/library/aa645769 (VS.71 ) .aspx

0
ответ дан 13 December 2019 в 19:33
поделиться

если класс SomeImpl содержит метод DoSemthing, это означает, что он скрывает исходный метод, а не заменяет его.

0
ответ дан 13 December 2019 в 19:33
поделиться

При работе с интерфейсами и абстрактными классами больше о том, что вы ДОЛЖНЫ делать, а не о том, что вы не можете. Таким образом, вы можете сообщить пользователю интерфейса, что это методы, которые они должны реализовать, и с вашими абстрактными классами вы можете использовать ключевое слово virtual , чтобы дать им знать его ОК для переопределения метода. Однако вы не можете помешать им делать слишком много. Даже если вы намеренно не используете ключевое слово virtual , они все равно могут скрыть его с помощью ключевого слова new .

0
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: