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

Я работаю над 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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