如何覆盖属性

Gle*_*cia -1 c# xamarin

在基础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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在孩子

public class CompanyStorageRepository : BaseStorageRepository<Company>
{
    protected new string OneKey = "Company";
    protected new string ListKey = "CompaniesList";
}
Run Code Online (Sandbox Code Playgroud)

执行时

UpdateAllAsync
Run Code Online (Sandbox Code Playgroud)

然后OneKey == null; 但为什么 ?毕竟,我在派生类中重新定义了属性

D S*_*ley 7

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

不,你隐藏了派生类中的字段(不是属性).有效地,派生类现在有两个不同的 OneKey字段.基类代码仍在查看基类中的字段,而不是new派生类中的字段.

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

public class CompanyStorageRepository : BaseStorageRepository<Company>
{
    public CompanyStorageRepository()
    {
        OneKey = "Company";
        ListKey = "CompaniesList";
    }
}
Run Code Online (Sandbox Code Playgroud)

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