Метод должен быть переопределен, но не абстрактен?

Python хранит Unicode как UTF-16. str () возвратит представление UTF-8 строки UTF-16.

6
задан Cœur 22 January 2017 в 15:02
поделиться

4 ответа

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();
14
ответ дан 8 December 2019 в 12:22
поделиться

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

1
ответ дан 8 December 2019 в 12:22
поделиться

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
}
1
ответ дан 8 December 2019 в 12:22
поделиться

Если ваш базовый класс делает что-то в методе, но вы хотите убедиться, что каждый подкласс принудительно реализует какую-то часть метода, тогда вам понадобится Шаблон метода шаблона , как описано в ответе Марка Гравелла.

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

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());
3
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

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