如何覆盖属性

本文关键字:属性 覆盖 何覆盖 | 更新日期: 2023-09-27 17:56:33

in base LocalStorage

 public class BaseStorageRepository<T> 
{
    protected string OneKey = null;
    protected string ListKey = null;
    public async Task UpdateAllAsync(List<T> data)
    {
        await BlobCache.LocalMachine.InsertObject(ListKey, data);
    }
}

在儿童中

public class CompanyStorageRepository : BaseStorageRepository<Company>
{
    protected new string OneKey = "Company";
    protected new string ListKey = "CompaniesList";
}

在 中执行时

UpdateAllAsync

则一键 == 空;但是为什么?毕竟,我在派生类中重新定义了属性

如何覆盖属性

毕竟,我在派生类中重新定义了属性

否,您在派生类中隐藏了字段(而不是属性)。 实际上,派生类现在有两个不同的OneKey字段。 基类代码仍在查看基类中的字段,而不是派生类中的new字段。

另请注意,字段不能是虚拟的或覆盖的。 不过,您可以在派生类的构造函数中设置字段值:

public class CompanyStorageRepository : BaseStorageRepository<Company>
{
    public CompanyStorageRepository()
    {
        OneKey = "Company";
        ListKey = "CompaniesList";
    }
}

稍微好一点的设计是使用属性而不是字段。 使用属性,您可以控制(和检测)值何时更改,并且可以更改值的存储方式,而不会破坏类半公共签名。