Есть ли способ сделать что 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.
Математически, умножение распределяет по сложению. По существу это означает:
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)
столь же лаконичен и более идиоматичен? Вероятно, нет.
Думаю, вы захотите взглянуть на дженерики.
Guide from MSFT:
http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx
В зависимости от контекста вы либо хотите дженерики или виртуальные методы.
Это эквивалентно методам классов в Object Pascal. (Реализация .NET будет оксигеном Remobject).
Однако в то время как ссылки на класс и, таким образом, методы виртуальных классов или, казалось бы, статические методы, которые могут доступить в какое-то состояние классового уровня, приятно в туда оригинальную платформу, я не думаю, что они имеют большой смысл для .NET или C #.
Я также использовался также программировать в Oxygene в течение нескольких лет, и я никогда не нуждался в классах.
Не потому, что я не знал, как их использовать. В «Оригинальном» объекте Platform Platform, родной Delphi, я использовал их все время. Но поскольку .NET и BCL не имеют никакой реальной поддержки для них, поэтому у вас нет никаких преимуществ, используя их. Принимая во внимание, что платформы, такие как Python или родные Delphi, поддерживают их в своих библиотеках.
Вы, очевидно, не хотите, чтобы статический метод, то, что вы хотите, это то, что может иметь государство и / или поддерживает наследство. Так что либо фабрики, либо в вашем случае конструктор может быть в порядке.