c# - 将派生类作为参数传递时,调试器是否应该抛出一些警告?
问题描述
我正在研究 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个翅膀而爸爸没有时,什么时候可以用儿子代替爸爸?
解决方案
不,不应该。您已经声明您的方法只需要一个“动物”即可运行。
如果您需要了解有关翅膀等的信息,那么您的合同可能是错误的?
在这种情况下,也许动物就足够了,让 ORM(例如实体框架)解决如何持久化它(即在单独的表中)。
推荐阅读
- automated-tests - 在测试用例末尾添加注销命令的效果如何?
- c - 字典未正确加载和拼写检查单词
- javascript - 控制台中显示“未定义”的来源
- javascript - 在 React 路由器中动态路由路径问题
- android - 如何在 Kotlin 中扩展自定义视图?
- ngrok - Ngrok 隧道 https 通过配置
- c# - 如何在 Specflow 的同一功能文件中提供多个数据作为输入
- java - Java:如何获得匹配模式的下一次
- sql - SQL Server:子查询返回相同的值
- javascript - 如何从包含对象列表的文件中导出对象并将同一对象导入另一个文件以便能够使用它?