Python хранит Unicode как UTF-16. str () возвратит представление UTF-8 строки UTF-16.
If the base-class has something to say, but you want it overridden "every time", then I would have a pair of methods:
public void DoSomething() {
//things to do before
DoSomethingCore();
//things to do after
}
protected abstract void DoSomethingCore();
Похоже, ваша базовая реализация никогда не будет вызвана. Зачем вам предоставлять реализацию, до которой никто не сможет добраться (несмотря на прыжки через обручи)
You're looking for a virtual
method (use this modifier to allow overriding the method), but you cannot force the user to overwrite it. Forcing this would not make sense if you have a body anyways, since one could just call base.YourMethod() and do nothing else, which does the same as not overriding the method in the first place.
public virtual YourMethod() {
// your base class code here
}
and then the overriding method in a different class:
public override YourMethod() {
// code to do before the base call
base.YourMethod();
// code to do after the base call
}
Если ваш базовый класс делает что-то в методе, но вы хотите убедиться, что каждый подкласс принудительно реализует какую-то часть метода, тогда вам понадобится Шаблон метода шаблона , как описано в ответе Марка Гравелла.
Нет способа предоставить реализацию по умолчанию в вашем базовом классе и при этом заставить подклассы предоставлять свою собственную реализацию. Однако вы можете создать абстрактный базовый класс и наследовать от него, чтобы обеспечить реализацию по умолчанию, но сделать этот конкретный класс запечатанным.
public abstract class FooBase {
public abstract void DoStuff();
}
public sealed class FooImpl : FooBase {
public override void DoStuff {
//default widget-munging code
}
}
Теперь любые классы, наследующие от FooBase, должны реализовывать DoStuff (), но у вас есть реализация по умолчанию FooImpl от какие подклассы не могут наследоваться.
Вы также можете передать ответственность за реализацию метода отдельному классу, который передается базовому классу в его конструкторе. Это называется шаблоном стратегии .
public sealed class Foo {
private IFooStrategy _strategy;
public Foo(IStrategy strategy) {
_strategy = strategy;
}
void DoStuff() {
_strategy.DoStuff();
}
public static IFooStrategy DefaultStrategy {
//return singleton instance of the default strategy
}
}
Теперь вместо создания подкласса Foo вы вместо этого создаете новые реализации интерфейса IFooStrategy и передаете их своему экземпляру Foo. Итак, вы можете сделать:
new Foo(Foo.DefaultStrategy);
или
new Foo(new DifferentStrategy());