Objective C
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
Swift
UIApplication.shared.isIdleTimerDisabled = true
Проблема в том, что вы не можете преобразовать родительский элемент в дочерний. Вы можете создать конструктор для дочернего класса, который принимает родительский класс в качестве параметра: Вопрос ques = новый вопрос (myPost);
Вы также можете использовать неявный оператор, чтобы упростить это: Вопрос ques = myPost;
http://www.codeproject.com/KB/cs/Csharp_implicit_operator.aspx
ИЗМЕНИТЬ: На самом деле, я просто попробовал напечатать для вас демонстрацию, выполняющую неявный оператор:
class Question : Post
{
public Question()
{
//...
}
public Question(Post p)
{
// copy stuff to 'this'
}
public static implicit operator Question(Post p)
{
Question q = new Question(p);
return q;
}
}
, но, очевидно, C # не позволяет вам выполнять неявные преобразования с базовым классом.
Публикация на данном этапе не является вопросом, и CLR справедливо жалуется. Вы можете преобразовать вопрос в сообщение, но не наоборот. Сейчас, если у вас была высокоуровневая ссылка на сообщение, которое, как вы знали, было Вопросом, вы могли бы опустить его следующим образом:
public Post Post
{
set
{
if (value is Question)
{
question = (Question)value;
}
}
}
Но даже это запах кода .
Но я думаю, что то, что вы пытаетесь достичь, может быть достигнуто без приведения классов или, возможно, вообще без наследования. Следуя почтенному принципу «предпочтение инкапсуляции, а не наследованию» , почему бы просто не обернуть объект Post в свой объект Question с чем-то вроде:
public class Question
{
Post post;
public Question(Post post)
{
this.post = post;
}
}
Предполагая, что вы определили свойства для соответствующих членов Post вместо
Question ques = (Question)post;
] у вас будет
Question ques = new Question(post);
Приведение не меняет объект, который вы приводите, поэтому он не может добавить отсутствующие элементы "Вопрос" к вашему объекту "Сообщение". Боюсь, вам просто нужно будет создать новый объект «Вопрос» и скопировать интересующие вас элементы из «Опубликовать» в «Вопрос».
Обратите внимание, что при приведении типов наоборот, от «Вопрос» до «Сообщение», будет работать нормально, потому что вы можете рассматривать вопрос как сообщение, не изменяя его - все обязательные поля уже есть.
Не могли бы вы сделать это:
public Question(Post P) : base(p) {...}
class Post
{
public Post(Post P)
{
populate(P.ID);
}
void populate(int ID)
{
// load from DB, or however it happens
}
}
... Если вы все равно создаете экземпляр Post из хранилища данных?
Если вы хотите изменить тип, то вам нужно либо написать код, либо иногда вы можете выполнить сериализацию. Сериализация не меняет тип (если только не был написан пользовательский оператор).
Самый простой вариант - это создать его в качестве правильного типа:
Post post = new Question();
В качестве альтернативы, добавьте оператор преобразования или другой метод для создания Вопроса
из сообщения:
class Question {
public Question(Post post) {
this.Author = post.Author;
this.Body = post.Body;
// ...
}
}
...
Question question = new Question(post);
Вы также можете использовать другие трюки, такие как рефлексивные копии свойств или сериализация; например, используя MiscUtil:
Question question = PropertyCopy<Question>.CopyFrom(post);
или protobuf-net (требуются некоторые дополнительные атрибуты сериализации):
Question question = Serializer.ChangeType<Post,Question>(post);