C#: разрешение недопустимого исключения броска между наследованным классом и его основой

Objective C

[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

Swift

UIApplication.shared.isIdleTimerDisabled = true
10
задан Maxim Zaslavsky 13 December 2009 в 04:34
поделиться

5 ответов

Проблема в том, что вы не можете преобразовать родительский элемент в дочерний. Вы можете создать конструктор для дочернего класса, который принимает родительский класс в качестве параметра: Вопрос 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 # не позволяет вам выполнять неявные преобразования с базовым классом.

22
ответ дан 3 December 2019 в 14:18
поделиться

Публикация на данном этапе не является вопросом, и 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);
6
ответ дан 3 December 2019 в 14:18
поделиться

Приведение не меняет объект, который вы приводите, поэтому он не может добавить отсутствующие элементы "Вопрос" к вашему объекту "Сообщение". Боюсь, вам просто нужно будет создать новый объект «Вопрос» и скопировать интересующие вас элементы из «Опубликовать» в «Вопрос».

Обратите внимание, что при приведении типов наоборот, от «Вопрос» до «Сообщение», будет работать нормально, потому что вы можете рассматривать вопрос как сообщение, не изменяя его - все обязательные поля уже есть.

4
ответ дан 3 December 2019 в 14:18
поделиться

Не могли бы вы сделать это:

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 из хранилища данных?

0
ответ дан 3 December 2019 в 14:18
поделиться

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

Самый простой вариант - это создать его в качестве правильного типа:

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);
3
ответ дан 3 December 2019 в 14:18
поделиться
Другие вопросы по тегам:

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