ほとんどのメソッドに Abstract クラスを使用し、欠落しているメソッドを実装するためにこの抽象クラスの子を使用して、子インターフェイスを実装しようとしています。しかし、コンパイラはこれらのエラーをスローし続けます:「Foo.Bar' はインターフェイス メンバーを実装していません」。長い時間コードを見つめ、StackOverflow で同様の問題を大量に読んだ後でも、問題がどこにあるのかわかりません。:S
これらは、私のコードで発生している「無数の」エラーの一部であり、実際に何が起こっているのかわかりません。
Error 2
'MyProject.Repository.EF.AccountRepository' does not implement interface member 'MyProject.Entities.IRepository<MyProject.Entities.Account,int>.FindAll()'.
'MyProject.Repository.EF.RepositoryBase<MyProject.Repository.EF.Account,int>.FindAll()' cannot implement 'MyProject.Entities.IRepository<MyProject.Entities.Account,int>.FindAll()' because it does not have the matching return type of 'System.Collections.Generic.IEnumerable<MyProject.Entities.Account>'.
D:\Projects\WebProjects\MyProject\MyProject.Repository.EF\AccountRepository.cs 5 18 MyProject.Repository.EF
///
そして、これがコードです
///
// リポジトリ インターフェース
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace MyProject.Entities
{
public interface IRepository<T, EntityKey> {
void Save();
void Add(T entity);
void Remove(T entity);
T FindBy(EntityKey id);
IEnumerable<T> FindBy(Expression<Func<T, bool>> query);
IEnumerable<T> FindBy(Expression<Func<T, bool>> query, int index, int count);
IEnumerable<T> FindAll();
}
}
///
// 「子」インターフェース
namespace MyProject.Entities
{
public interface IAccountRepository : IRepository<Account, int> {
}
}
///
// インターフェイスからほぼすべてのメソッドを実装し、そのうちの 2 つを子クラスによって実装される抽象として宣言する抽象クラス
using MyProject.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace MyProject.Repository.EF
{
public abstract class RepositoryBase<T, EntityKey> : IRepository<T, EntityKey> where T : class {
private IQueryable<T> objectSet;
protected MyProjectEntitiesContext Context;
public abstract string GetEntitySetName();
public abstract T FindBy(EntityKey id);
public IQueryable<T> ObjectSet
{
get { return objectSet; }
set { objectSet = value; }
}
public void Save()
{
this.Context.SaveChanges();
}
public void Add(T entity)
{
this.Context.AddObject(this.GetEntitySetName(), entity);
}
public void Remove(T entity)
{
this.Context.DeleteObject(entity);
}
public IEnumerable<T> FindAll()
{
return this.ObjectSet;
}
public IEnumerable<T> FindBy(Expression<Func<T, bool>> query)
{
return this.ObjectSet.Where(query);
}
public IEnumerable<T> FindBy(Expression<Func<T, bool>> query, int index, int count)
{
return this.FindBy(query).Skip(index).Take(count);
}
}
}
///
// ここでは、不足している 2 つのメソッドが実装されています
using System.Linq;
using MyProject.Entities;
namespace MyProject.Repository.EF {
public class AccountRepository : RepositoryBase<Account, int>, IAccountRepository {
public AccountRepository()
{
this.Context = MyProjectEntitiesFactory.GetDatacontext();
this.ObjectSet = this.Context.Accounts;
}
public override string GetEntitySetName()
{
return this.Context.Accounts.EntitySet.Name;
}
public override Account FindBy(int id)
{
return this.ObjectSet.FirstOrDefault(i => i.Id == id);
}
}
}