我在一个项目中有一系列类,它们在不同的对象上完全相同。由于其中一些已经在不同的时间和不同的人编码,因此在命名方面存在一些不一致。我希望以一种方式更新我的代码,这种方式不仅会在当前对象中强制执行某些一致性,而且还会在将来创建新的一致性。我对编程的理解使我相信我需要一个基类或一个接口,但我无法弄清楚如何让它们工作。我想要的方法是:
internal BusinessObject MethodA(EntityObject entity)
internal Void MethodB(EntityContext context, BusinessObject obj, EntityObject entity)
我遇到的问题是,在每个类中,“BusinessObject”和“EntityObject”将是不同的,例如在一个中它可能是“CarObject和CarEntity”,在另一个中它可能是“BusObject和BusEntity”。我仍然想要这两个方法,我仍然希望它们命名为MethodA和MethodB我只想在实现中交换出实际的对象类型。实现本身将是不同的,因为它们使用不同的对象。
我在编译时知道对象类型,并且需要能够访问对象的属性,因此如果使用泛型,我需要在实现中将泛型转换为正确的类型。此外,MethodA的实现需要创建一个“新的”BusinessObject,即“BusinessObject x = new BusinessObject()”,如果这有任何区别。
我尝试在方法中使用带泛型的接口,还尝试使用抽象方法的基类,但我无法弄清楚如何使用它们。
处理此问题的最佳方法是什么?我们非常感谢示例代码。
答案 0 :(得分:3)
泛型是方式
所以我会沿着以下几行声明一个接口(或者如果你喜欢这个路由的基类):
internal interface IEntityContext<TEntity>
{
???
}
internal interface IMyInterfaceName<TEntity, TBusinessObject>
{
TBusinessObject MethodA(TEntity entity);
Void MethodB(IEntityContext<TEntity> context, TBusinessObject obj, TEntity entity);
}
然后说到实现你的课程:
class MyClassThatDoesThisStuff : IMyInterfaceName<Farm, FarmBo>
{
internal FarmBo MethodA(Farm entity);
internal Void MethodB(IEntityContext<Farm> context, FarmBo obj, Farm entity);
}
等...
你还可以强制你的类来自某些东西:
interface IMyInterfaceName<TEntity, TBusinessObject>
where TEntity : EntityBase,
TBusinessObject : BusinessObjectBase
{
...
}
答案 1 :(得分:2)
只是为了展示一个抽象基类的解决方案,请参阅Neils回答以获取更多信息......
public abstract class BaseClass<A,B> {
internal abstract A MethodA(B entity);
internal abstract void MethodB(EntityContext context, A obj, B entity);
}
然后扩展这个类:
public class AClass : BaseClass<BusinessObject, EntityObject> {
internal override BusinessObject MethodA(EntityObject entity) {...}
internal override void MethodB(EntityContext ctx, BusinessObject obj, EntityObject entity) {...}
}
答案 2 :(得分:1)
实际上有三种方法:
泛型:您指定容器对象的方式,因为它独立于BusinessObject和EntityObject的类型。您可以稍微扩展一下,以限制泛型接受的对象类型作为具有泛型约束的参数。最大的挑战是,如果没有强制转换和其他相对不安全的操作,很难实际使用BusinessObject和EntityObject。
继承:在这种情况下,您将BusinessObject实现为基类,并要求将所有用作参数的对象派生自该对象,并与EntityObject类似。然后,您可以在基类中放置实际需要使用的任何方法(如果需要,可以在派生类中覆盖它们。)
接口:这是两者之间的一半。在这里你说BusinessObject和EntityObject是接口(传统上它们的名称将以I开头,如在IBusinessObject等中)。在这里,您在接口中指定需要任何BusinessObject或EntityObject实现的方法,并因此可以在容器中调用它们对象
因此,您提供的信息有限,不可能说哪个最合适。但是,这些是你的三个基本选择。