Как выставить базовый класс, сохраняя производные внутренние

Я обнаружил, что делаю что-то подобное, нужно преобразовать адреса с порядковыми номерами («Третий St») в формат, который может постигнуть геокодер («Третий St»). Хотя это не очень элегантно, одним быстрым и грязным решением является использование inflect.py для создания словаря для перевода.

Функция inflect.py имеет функцию number_to_words(), которая превратит число (например, 2) в его текстовую форму (например, 'two'). Кроме того, существует функция ordinal(), которая будет принимать любое число (цифра или форма слова) и превращать его в его порядковую форму (например, 4 -> fourth, six -> sixth). Ни один из них сам по себе не выполняет то, что вы ищете, но вместе вы можете использовать их для создания словаря для перевода любого предоставленного порядкового номера-слова (в пределах разумного диапазона) в соответствующий порядковый номер. Взгляните:

>>> import inflect
>>> p = inflect.engine()
>>> word_to_number_mapping = {}
>>>
>>> for i in range(1, 100):
...     word_form = p.number_to_words(i)  # 1 -> 'one'
...     ordinal_word = p.ordinal(word_form)  # 'one' -> 'first'
...     ordinal_number = p.ordinal(i)  # 1 -> '1st'
...     word_to_number_mapping[ordinal_word] = ordinal_number  # 'first': '1st'
...
>>> print word_to_number_mapping['sixth']
6th
>>> print word_to_number_mapping['eleventh']
11th
>>> print word_to_number_mapping['forty-third']
43rd

Если вы готовы посвятить некоторое время, возможно, будет возможно изучить внутреннюю работу inflect.py в обеих этих функциях и создать свой собственный код, чтобы сделать это динамически (Я не пытался это сделать).

1
задан Bercovici Adrian 13 July 2018 в 10:22
поделиться

1 ответ

Вы можете просто сделать Node общедоступным и сохранить внутренние производные классы. Не имея отношения к этому, вы должны думать о том, чтобы не выводить Node во вложенные классы для лучшей ремонтопригодности:

public abstract class Node {
}

internal class ANode : Node {
    public byte[] internalValue;
}

internal class BNode : Node {
    public int internalValue;
}

Если вы хотите иметь возможность создавать экземпляры ANode и BNode из внешних сборок , вы можете использовать абстрактный завод:

public static class NodeFactory {
    public Node CreateNode(byte[] value) {
        return new ANode { internalValue = value };
    }

    public Node CreateNode(int value) {
        return new BNode { internalValue = value };
    }
}
3
ответ дан Sefe 17 August 2018 в 13:10
поделиться
  • 1
    Я думал, что вы не можете иметь содержащий класс public и вложенные internal. Я думал, что вся иерархия должна делиться доступом. – Bercovici Adrian 13 July 2018 в 12:00
  • 2
    @BercoviciAdrian: Нет, этого нет, и многие шаблоны дизайна полагаются на этот факт. Вы не можете изменить доступность member , но вы можете изменить доступность type . – Sefe 13 July 2018 в 12:18
Другие вопросы по тегам:

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