Стиль Python classmethod для C#?

Есть ли способ сделать что classmethod в Python в C#?

Таким образом, статическая функция, которая получила бы Текстовый объект как (неявный) параметр согласно тому, какой бы ни разделяют на подклассы, это используется от.

Пример того, что я хочу, приблизительно,

class Base:
    @classmethod
    def get(cls, id):
        print "Would instantiate a new %r with ID %d."%(cls, id)

class Puppy(Base):
    pass

class Kitten(Base):
    pass

p = Puppy.get(1)
k = Kitten.get(1)

ожидаемое вывод быть

Would instantiate a new  with ID 1.
Would instantiate a new  with ID 1.

(тот же код codepad здесь.)

6
задан AKX 13 January 2010 в 17:35
поделиться

4 ответа

Математически, умножение распределяет по сложению. По существу это означает:

x * (a + b + c...) = (x * a) + (x * b) + (x * c)...

Любое вещественное число (в вашем случае 7 ) может быть представлено как ряд дополнений (например, 8 + (-1) , так как вычитание - это действительно просто сложение, идущее не в тот путь). Это позволяет представить любой единичный оператор умножения в виде эквивалентного ряда операторов умножения, что даст тот же результат:

x * 7
= x * (8 + (-1))
= (x * 8) + (x * (-1))
= (x * 8) - (x * 1)
= (x * 8) - x

Оператор побитового сдвига по существу просто умножает или делит число на степень 2. До тех пор, пока уравнение имеет дело только с такими значениями, сдвиг битов может быть использован для замены всех вхождений оператора умножения.

(x * 8) - x = (x * 2 3 ) - x = (x < < 3) - x

Подобная стратегия может использоваться для любого другого целого числа, и она не имеет никакого значения, нечетная она или четная.

-121--1106998-

Я бы очень не хотел включать исходный код в свой собственный проект. Да, пользователю нужно добавить еще одну ссылку... но это значит, что они знают, откуда она взялась. Может быть, они захотят использовать его в другом месте - может, они даже будут использовать другой проект с той же библиотекой. Вы не хотите, чтобы в конечном итоге было несколько копий одного типа.

Кроме того, сохранение библиотеки в виде отдельной библиотеки значительно облегчит ее обновление при изменении сторонней библиотеки.

Существуют некоторые проекты, которые явно предоставляют «один исходный файл» версии библиотеки, чтобы упростить встраивание в проект. (например, linqbridge ). Это несколько меняет вещи - в этот пункт я думаю, что разумнее включить его, если вы хотите. Но для «нормальных» проектов я бы просто добавил ссылку.

-121--5044823-

В принципе, вы могли бы написать что-то подобное:

class Base
{
    public static T Get<T>(int id)
        where T : Base, new()
    {
        return new T() { ID = id };
    }

    public int ID { get; set; }
}

Тогда вы могли бы написать var p = Base.Get < Щенок > (10) . Или, если вы чувствовали себя мазохистом, вы могли бы написать Puppy.Get < Щенок > (10) или даже Kitty.Get < Щенок > ;) Во всех случаях необходимо передать тип явно, а не неявно.

Как вариант, это также работает:

class Base<T> where T : Base<T>, new()
{
    public static T Get(int id)
    {
        return new T() { ID = id };
    }

    public int ID { get; set; }
}

class Puppy : Base<Puppy>
{
}

class Kitten : Base<Kitten>
{
}

Вам все еще нужно передать тип обратно в базовый класс, что позволяет написать Puppy.Get (10) , как ожидалось.

Но все же есть ли причина писать это так, когда var p = новый Щенок (10) столь же лаконичен и более идиоматичен? Вероятно, нет.

2
ответ дан 17 December 2019 в 00:09
поделиться

Думаю, вы захотите взглянуть на дженерики.

Guide from MSFT:

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

3
ответ дан 17 December 2019 в 00:09
поделиться

В зависимости от контекста вы либо хотите дженерики или виртуальные методы.

2
ответ дан 17 December 2019 в 00:09
поделиться

Это эквивалентно методам классов в Object Pascal. (Реализация .NET будет оксигеном Remobject).

Однако в то время как ссылки на класс и, таким образом, методы виртуальных классов или, казалось бы, статические методы, которые могут доступить в какое-то состояние классового уровня, приятно в туда оригинальную платформу, я не думаю, что они имеют большой смысл для .NET или C #.

Я также использовался также программировать в Oxygene в течение нескольких лет, и я никогда не нуждался в классах.

Не потому, что я не знал, как их использовать. В «Оригинальном» объекте Platform Platform, родной Delphi, я использовал их все время. Но поскольку .NET и BCL не имеют никакой реальной поддержки для них, поэтому у вас нет никаких преимуществ, используя их. Принимая во внимание, что платформы, такие как Python или родные Delphi, поддерживают их в своих библиотеках.

Вы, очевидно, не хотите, чтобы статический метод, то, что вы хотите, это то, что может иметь государство и / или поддерживает наследство. Так что либо фабрики, либо в вашем случае конструктор может быть в порядке.

0
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

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