Я пытаюсь абстрагировать свой простой IRepository
параметр сущности с абстрактным типом Entity<T>
, чтобы подчиняться принципу СУХОЙ и не повторять Create(this)
в дочерних классах. Но я сталкиваюсь с этой ошибкой:
CS1503 Аргумент 1: невозможно преобразовать из «Entity» в «T»
IRepository.cs:
public interface IRepository<T>
{
void Create(T entity);
IEnumerable<T> ReadAll();
}
Entity.cs:
public abstract class Entity<T>
{
protected IRepository<T> repository;
public void Create()
{
repository.Create(this);//Error occurs here on this
}
}
Но если сделать public void Create()
абстрактным и реализовать в подклассе, все пойдет нормально:
Entity.cs
public abstract class Entity<T>
{
protected IRepository<T> repository;
public abstract void Create();//Signature changed
}
TestEntity.cs
public class TestEntity:Entity<TestEntity>
{
public override void Create()
{
repository.Create(this);
}
}
Но, очевидно, этот метод будет скопирован и вставлен во все подклассы Entity
.
Для дополнительной помощи моим дорогим друзьям:
public abstract class Base<T>
{
public abstract String GetName();
public String GetMyName()
{
return $"My Name is :{this.GetName()} Type:{this.GetType().ToString()} Is Base<T>:{this is Base<T>}";
}
}
public class Sample : Base<Sample>
{
public override string GetName()
{
return nameof(Sample);
}
}
и MessageBox.Show(new Sample().GetMyName());
результат будет:
Меня зовут: Тип выборки: Пример базы: True
без ошибок.
Это еще один ответ, основанный на ответе одного из друзей:
public interface IRepository<T>
{
void Create(Entity<T> entity);
IEnumerable<T> ReadAll();
}
public abstract class Entity<T>
{
protected IRepository<T> repository;
public virtual void Create()
{
repository.Create(this);
}
}
public class TestEntity : Entity<TestEntity>
{
public String Name { get; set; }
}
public class Repository<T> : IRepository<T>
{
List<T> list = new List<T>();
public void Create(Entity<T> entity)
{
list.Add(this);//Error
list.Add(entity);//Also Error
}
public IEnumerable<T> ReadAll()
{
return list;
}
}