Мне очень нравится версия документа 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))
По умолчанию методы в 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");
}
}
По умолчанию все методы запечатаны, но невозможно предотвратить скрытие элементов.
Компилятор C # выдает предупреждение компилятора всякий раз, когда вы скрываете член, но кроме этого, вы не можете предотвратить это.
Метод, не помеченный как виртуальный , по умолчанию запечатан. В производном классе вы должны пометить «замещающий» метод ключевым словом new , иначе вы получите предупреждение компилятора. Если метод суперкласса отмечен как виртуальный, вы можете запечатать его в соответствии с запечатанным переопределением .
http://msdn.microsoft.com/en-us/library/aa645769 (VS.71 ) .aspx
если класс SomeImpl содержит метод DoSemthing, это означает, что он скрывает исходный метод, а не заменяет его.
При работе с интерфейсами и абстрактными классами больше о том, что вы ДОЛЖНЫ делать, а не о том, что вы не можете. Таким образом, вы можете сообщить пользователю интерфейса, что это методы, которые они должны реализовать, и с вашими абстрактными классами вы можете использовать ключевое слово virtual , чтобы дать им знать его ОК для переопределения метода. Однако вы не можете помешать им делать слишком много. Даже если вы намеренно не используете ключевое слово virtual , они все равно могут скрыть его с помощью ключевого слова new .