Должен ли отладчик выдавать предупреждение при передаче производного класса в качестве параметра?

Я работаю над ASP.NET Core и нашел вещь о наследовании (поскольку IdentityUser может быть получен с помощью ApplicationUser).

Вот просто демонстрация, чтобы объяснить, что это такое:

Сущности:

public class Animal
{
    public string Name { get; set; }
}

public class Cat : Animal
{
    // cat has no wings...
}

public class Eagle : Animal
{
    public object LeftWing { get; set; }
    public object RightWing { get; set; }
}

Контекст базы данных (только для демонстрации):

public void SaveChanges(Animal animal)
{
    // save changes for "Animals" table...
}

И используйте это:

var cat = new Cat { Name = "Norris" };
var eagle = new Eagle { Name = "Voldemort", LeftWing = "good", RightWing = "broken" };

SaveChanges(cat);
SaveChanges(eagle);

// in asp.net core, this can be:
// public class ApplicationUser : IdentityUser {}

// _dbContext.Users.Add(new ApplicationUser { ExtensionProperty = "foo" });

// but we forgot to update the "Users" table 
// which refers to "ApplicationUser" class instead if "IdentityUser" class by default
// _dbContext.Users.Add(new IdentityUser());

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

Кроме того, не у всех животных есть крылья, поэтому их не нужно определять в таблице Animals.

Чтобы исправить этот проблема, мы можем создать две таблицы Cats и Eagles.

Но в этом посте я просто хочу упомянуть о наследовании.

Когда папу можно заменить сыном, а у сына 2 крыла, а у папы нет?

Вы спрашиваете о таблицах по типам и таблицам по иерархии? Выполните поиск по тем, у кого есть структура сущности ключевого слова, там достаточно материала, чтобы ответить на ваш вопрос (я думаю). Если нет, перефразируйте свой вопрос, потому что совершенно непонятно, о чем вы спрашиваете (во всяком случае, мне).

Igor 31.10.2018 12:07

@ Игорь О. Мне жаль. Я имею в виду, когда я пытался обновить базу данных с некоторыми свойствами расширения, которые не определены в таблице. Отладчик не выдает никаких предупреждений об этом. Это все еще действующее действие.

Tân 31.10.2018 12:14
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, не должно. Вы заявили, что вашему методу для работы требуется только «Животное».

Если вам нужно знать о крыльях и т. д., То, возможно, ваш контракт неверен?

В этом случае, возможно, достаточно животного, и пусть ORM (например, Entity Framework) решит, как его сохранить (то есть в отдельных таблицах).

then perhaps your contract is wrong?. Да, вы понимаете, о чем я, спасибо! но поскольку Cat и Eagle являются производными от Animal, я не получал никаких предупреждений / сообщений об ошибках из-за наследования.
Tân 31.10.2018 12:21

Я бы не ожидал, что вы получите предупреждение! Вы выбрали Animal в качестве типа параметра метода. Ваш метод должен работать с Animal! Если это не так, вам нужно изменить подпись метода. Добавив Animal в подпись, вы заключили договор и заявляете потребителям, что можете обращаться со всеми производными животными.

David Kiff 31.10.2018 15:41

Другие вопросы по теме