Существует возможность, что так или иначе у Вас есть строка non-unicode с unicode символами ESC, например:
>>> print repr(text)
'I don\\u2018t like this'
Это на самом деле произошло со мной однажды. Можно использовать unicode_escape
кодек, чтобы декодировать строку к unicode и затем закодировать его к любому формату, который Вы хотите:
>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this
Вы можете сделать класс Animal универсальным.
class Animal<T> where T : Animal<T>
{
public static T Create()
{
// Don't know what you'll be able to do here
}
}
class Dog : Animal<Dog>
{
}
Но как класс Animal
знает, как создавать экземпляры производных типов?
В дополнение к другим ответам о способах решения этой проблемы вы можете увидеть, используя отражение, что Create всегда будет частью Animal, а не производного класса.
Я бы сделал абстрактный класс Animal с помощью статического метода Create; это фактически отправная точка для завода. На самом деле, похоже, что вы отменяете фабричный класс.
Если вы добавите абстрактный метод Initialize в класс Animal, метод Create станет следующим:
public static T Create<T>() where T : Animal {
T animal = new T(); //may need a "new" in the declaration
animal.Initialize(); //or Create or whatever or you put this logic
// in the constructor and don't call this at all.
return animal;
}