Как вынудить sub классы реализовать метод

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

  • объект 1
  • объект 2
  • , объект 3

должен был бы быть

арабский текст 1 -

арабский текст 2 -

арабский текст 3 -

(инвертированный маркированный список, кажется, не работает: P)

, который может быть кошмаром UI, если Ваша система должна применить изменения динамично, как только пользователь изменяет используемый язык.

Другая очень твердая вещь состоит в том, чтобы протестировать различные языки, не только для правильности слова, но и так как языки как корейский язык обычно имеют больший тип шрифта для своих символов, это может привести к языку определенные ошибки (как текст "СОХРАНЕНИЯ" на кнопке, являющейся больше, чем сама кнопка для некоторого языка).

43
задан Kelsey 1 September 2011 в 16:35
поделиться

4 ответа

Вы можете иметь абстрактные методы в классе с другими реализованными методами. Преимущество перед интерфейсом заключается в том, что вы можете включить некоторый код в свой класс и заставить новый объект заполнять детали для абстрактных методов.

public abstract class YourClass
{
    // Your class implementation

    public abstract void DoSomething(int x, int y);

    public void DoSomethingElse(int a, string b)
    {
        // You can implement this here
    }
}
61
ответ дан 26 November 2019 в 22:46
поделиться

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

EDIT: (на основе потока в комментариях ниже) Для этого базовый класс должен быть объявлен как абстрактный ... У вас не может быть абстрактного метода в не абстрактном классе, потому что неабстрактный класс может быть создан, и если экземпляр из-за того, что он был создан, для этого метода не будет НИКАКОЙ реализации. Так что это незаконно. Объявляя базу как абстрактную, вы запрещаете создание экземпляра класса. Затем могут быть созданы экземпляры только неабстрактных производных классов, где (поскольку базовый метод является абстрактным) вы ДОЛЖНЫ добавить реализацию для этого метода.

Объявляя базу как абстрактную, вы запрещаете создание экземпляра класса. Затем могут быть созданы экземпляры только неабстрактных производных классов, где (поскольку базовый метод является абстрактным) вы ДОЛЖНЫ добавить реализацию для этого метода.

Объявляя базу как абстрактную, вы запрещаете создание экземпляра класса. Затем могут быть созданы экземпляры только неабстрактных производных классов, где (поскольку базовый метод является абстрактным) вы ДОЛЖНЫ добавить реализацию для этого метода.

6
ответ дан 26 November 2019 в 22:46
поделиться

Интерфейс - если применяется только к базовый класс, то подклассы не нужно реализовать только функцию базовый класс делает.

Это не совсем правильно. Если базовый класс является абстрактным, вы можете пометить методы, принадлежащие интерфейсу, как абстрактные, и принудительно реализовать реализацию в подклассах.

Это дает возможность, о которой вы не упомянули: использовать оба. У вас есть интерфейс IFoo и абстрактный базовый класс FooBase , который его реализует, или его часть. Это обеспечивает подклассы с реализацией интерфейса (или его части) «по умолчанию», а также позволяет вам наследовать от чего-то еще и при этом реализовывать интерфейс, или если вы хотите реализовать интерфейс, но не наследовать реализацию базового класса. Пример может помочь:

// Your interface
interface IFoo { void A(); void B; }

// A "default" implementation of that interface
abstract class FooBase : IFoo
{
    public abstract void A();

    public void B()
    {
        Console.WriteLine("B");
    }
}

// A class that implements IFoo by reusing FooBase partial implementation
class Foo : FooBase
{
    public override void A()
    {
        Console.WriteLine("A");
    }
}

// This is a different class you may want to inherit from
class Bar
{
    public void C()
    {
        Console.WriteLine("C");
    }
}

// A class that inherits from Bar and implements IFoo
class FooBar : Bar, IFoo
{
    public void A()
    {
        Console.WriteLine("Foobar.A");
    }
    public void B()
    {
        Console.WriteLine("Foobar.B");
    }
}
14
ответ дан 26 November 2019 в 22:46
поделиться

Абстрактный класс - работал бы, но у базового класса есть полезный помощник функции, которые используются некоторыми из subclasse

Абстрактный класс не требует, чтобы все предоставляемые им функции были абстрактными.

abstract class Base {
    public void Foo() {} // Ordinary method
    public virtual void Bar() {} // Can be overridden
    public abstract void Xyz(); // This one *must* be overridden
}

Обратите внимание, что если вы замените public на protected , отмеченный метод будет только , видимый для базовых классов и подклассов.

11
ответ дан 26 November 2019 в 22:46
поделиться
Другие вопросы по тегам:

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