【发布时间】:2014-12-01 09:16:58
【问题描述】:
我尝试将一些操作提取到具有类似这样的一些附加属性的接口中:
基础实体类:
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);
}
}
问题是我如何使用来自ClassB 或ClassC 的附加属性创建IMyClassRepository 的实现?
【问题讨论】:
-
如果它们完全不同,也许继承不是这里的解决方案。
-
void Create(MyBaseClass param);?你能解释一下这个方法应该做什么吗? (通常Create会返回它刚刚创建的内容,但在您的设计中并非如此)。 -
@JustinPihony 但它们具有相同的实体和相同的操作。
-
@AlexeiLevenkov 它应该保存一些记录。
-
如果方法需要 ClassB 的属性,那么它需要一个 ClassB 作为参数。
标签: c# inheritance design-patterns interface abstract-class