接口具有从基类派生的附加属性

时间:2014-10-07 02:21:14

标签: c# inheritance design-patterns interface abstract-class

我尝试将一些操作提取到一个具有一些附加属性的接口中:

基本实体类:

public enum MyClassEnum
{
    classA,
    classB,
    classC
}

public abstract class MyBaseClass
{
    public string entityA { get;set; }
    public int entityB { get; set; }
}

然后我有一些来自MyBaseClass的课程:

public class ClassA : MyBaseClass{}

public class ClassB : MyBaseClass
{
    public string AnotherEntity { get; set; }
}

public class ClassC : MyBaseClass
{
    public string AnotherEntity2 { get; set; }
    public string AnotherEntity3 { get; set; }
}

我尝试使用这样的界面(这是我到目前为止):

public interface IMyClassRepository
{
    void Create(MyBaseClass param);
    void Update(MyBaseClass param);
}

具体类应该是这样的:

public class ClassBRepository : IMyClassRepository
{
    private readonly BaseRepository _baseRepository;

    public ClassBRepository
    {
        _baseRepository = new BaseRepository();
    }

    public void Create(MyBaseClass param)
    {
        // will use automapper to do the mapping
        var theClassB = MyBaseClass.TranslateTo<ClassB>();

        // How i can design the interface that accept additional Property on class B?

        // last save the operation to DB..
        _baseRepository.Save(theClassB);
    }
}
  

更新

我将创建IMyClassRepository使用Factory,如下所示:

public class MyClassFactory
{
    public IMyClassRepository CreateInstance(MyClassEnum param)
    {
        switch(param)
        {
            case MyClassEnum.ClassA
            {
                return new ClassARepository;
            }

            case MyClassEnum.ClassB
            {
                return new ClassBRepository;
            }

            case MyClassEnum.ClassC
            {
                return new ClassCRepository;
            }
        }
    }
}

最后有这样的操作类:

public class ConcreteOperationClass
{
    private IMyClassRepository _myClass;
    public ConcreteOperationClass(MyClassEnum param)
    {
        _myClass = new MyClassFactory().CreateInstance(param);
    }

    public void CreateMyClass(MyBaseClass param, // this should be a parameter class B or Class C needed)
    {
        _myClass.Create(param, // additional property for classB or classC);
    }
}

问题是如何使用IMyClassRepositoryClassB的其他属性创建ClassC的实现?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你是否试图设计类似于存储库模式的东西?如果是这种情况,您可以为所有实体创建存储库实现。为此,您需要创建一个通用接口,该接口适用于您实体的具体实现......

public interface IMyClassRepository<T> where T : MyBaseClass
{
    T Get(int id);
    void Create(T param);
    void Update(T param);
}

然后为每个实体创建此存储库的实现...

public ClassARepo : IMyClassRepository<ClassA>{...}

然后您可以创建一个工厂对象,即时提供这些具体实现。有点像...

var repository = RepositoryFactory.Resolve<ClassB>(); 
ClassB entity = repository.Get(234);
entity.entityA = "new value";
repository.Update(entity);

如果您使用Windsor Castle等D / I容器,您甚至不必自己实现它,您可以通过配置文件定义实现和服务,甚至可以交换它们而无需重新编译整个应用程序。