如何覆盖属性

时间:2016-07-11 13:18:35

标签: 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);
    }
}

在孩子身上

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

执行时

UpdateAllAsync

然后OneKey == null; 但为什么 ? 毕竟,我在派生类

中重新定义了属性

1 个答案:

答案 0 :(得分:7)

  

毕竟,我在派生类

中重新定义了属性

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

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

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

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