oop - 自动实现属性的 C# 协变返回
问题描述
如您所知,C# 9.0 (.Net 5) 现在允许 Covariant Returns。我需要帮助将其应用于一组具有自动实现属性的类。
我有两个代表金融银行账户和交易的抽象类。我将它们抽象化,因为我将从各种数据源中提取数据,虽然主要属性将在所有数据源中通用,但每个数据源可能有我想要保留的其他字段。两个类之间存在一对多的关系(1 个账户有很多交易,1 个交易只属于 1 个账户)。
public abstract class BankAccount
{
public string Name { get; set; }
public IList<Transaction> Transactions { get; set; } = new List<Transaction>();
...
}
public abstract class Transaction
{
public string Name { get; set; }
public virtual BankAccount BankAccount { get; set; } // This doesn't work unless I remove set;
...
}
这是一个具体实现的例子
public class PlaidBankAccount : BankAccount
{
public string PlaidId { get; set; }
...
}
public class PlaidTransaction : Transaction
{
public string PlaidId { get; set; }
public override PlaidBankAccount BankAccount { get; set; } // This doesn't work unless I remove set;
...
}
我想要做的是覆盖基类 getter 和 setter,以便它们使用派生类。例如:
如果我创建一个具体事务的实例并调用BankAccount
getter,我想获得一个派生的实例而PlaidBankAccount
不是 base BankAccount
。
我发现,当我只在基类中定义虚拟 getter 并在派生类中覆盖它时,它可以工作。但是就像我添加两个属性 {get;set;} 一样,我得到了与以前的 C# 版本相同的错误:
error CS1715: 'PlaidTransaction.BankAccount': type must be 'BankAccount' to match overridden member 'Transaction.BankAccount'
我该如何解决这个问题?
解决方案
在 C# 9 中,属性只有在它们是readonly时才能具有协变返回,所以不幸的set;
是,不可能。
覆盖属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称。从 C# 9.0 开始,只读覆盖属性支持协变返回类型。被覆盖的属性必须是虚拟的、抽象的或覆盖的。
推荐阅读
- r - How to transfom a distance vector to the adjacent cells to centred matrix of distance
- python - Python Pandas:带有条件的运行累积总数的自联接
- arrays - memory for array initialization with string literal
- python - TypeError: 'NoneType' object is not iterable , python opencv
- mysql - Self join within the table in mariaDB
- javascript - Return PHP value to AJAX confusion
- android - Fragment reloading again when switching back to it
- javascript - How do I actually add Filesystem Access API to javascript?
- python - to convert the datetime.time into string
- python-3.x - 尝试在 Jupyter Notebook 环境中执行二进制文件时出现“找不到命令错误”