Реализация класса BaseEntity в c# - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь реализовать класс BaseEntity в c#, и я нашел пример, подобный этому:

 public abstract class BaseEntity<T> : IBaseEntity<T>
 {
    public T Id { get; set; }
    object IBaseEntity.Id
    {
       get { return Id; }
    }
    public bool IsValid { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
 }

Мне интересно, почему этот пример наследуется от интерфейса IBaseEntity , действительно ли это было нужно?

Что на самом деле делает этот кусок кода?

object IBaseEntity.Id
{
    get { return Id; }
}

Это действительно сбивает меня с толку ..

Не могу Разве это не должно быть написано просто так:

public abstract class BaseEntity<T> 
{
    public T Id { get; set; } // I guess this "T" means that this id might be of different type? like long, guid, int?

    public bool IsValid { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
}

Полагаю, это можно было бы написать так, как в последнем примере, но первый пример более полезен? Но я не могу понять, почему, поскольку я действительно новичок.

Если бы кто-то мог мне это объяснить, я бы оценил это так сильно!

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Вы пропустили определения интерфейсов, которые, как я полагаю, выглядят примерно так:

IBaseEntity{
    object Id { get; }
}
IBaseEntity<T>:IBaseEntity{
    T Id { get; set; }
}

Решаемая здесь проблема - не реализация BaseEntity, а вызывающая сторона, которая хочет справиться с ними. Если вы хотите сослаться на экземпляр IBaseEntity<T>, ваш код должен знать тип T. Принуждение к добавлению переопределения generi c к каждому классу / методу или большому размышлению. Однако этого можно избежать, если использовать базовый интерфейс IBaseEntity. например;

    Dictionary<object, IBaseEntity> entities = ...;
    entities[e.Id] = e;
0 голосов
/ 20 марта 2020

Что на самом деле делает этот кусок кода?

Это называется явной реализацией интерфейса: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation

Делая это, Метод / свойство доступно только через тип интерфейса, но не через тип класса.

Не может ли это быть написано просто так:

Да и нет. Это зависит от потребностей. В этом случае я бы сказал, что ответ «нет», потому что Id на интерфейсе только для чтения. Похоже, что автор намеренно сделал это так, чтобы его можно было читать, а не записывать через интерфейс только в тех типах, которые знают интерфейс. Id легко установить.

Однако, если Id можно читать и записывать, возможно, не удастся использовать интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...