1

我在一个项目中有一系列类,它们基本上都做同样的事情,但在不同的对象上。由于其中一些是在不同的时间和不同的人编码的,因此在命名上存在一些不一致。我想以一种不仅在当前对象中而且在将来创建的新对象中强制保持某种一致性的方式更新我的代码。我对编程的理解使我相信我需要一个基类或一个接口,但我不知道如何让它们工作。我想要的方法是:

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()”,如果这有什么不同的话。

我尝试在方法中使用带有泛型的接口以及带有抽象方法的基类,但我无法弄清楚如何让它们工作。

处理这个问题的最佳方法是什么?示例代码将不胜感激。

4

3 回答 3

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);

}

ETC...

您还可以强制您的类来自某些东西:

interface IMyInterfaceName<TEntity, TBusinessObject> 
            where TEntity : EntityBase,
                  TBusinessObject : BusinessObjectBase
{
...
}
于 2011-01-27T20:59:47.070 回答
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) {...}
}
于 2011-01-27T21:01:28.657 回答
1

实际上有三种方法:

  1. 泛型:您以独立于 BusinessObject 和 EntityObject 类型的方式指定容器对象。您可以对其进行一些扩展,以对泛型接受作为具有泛型约束的参数的对象类型进行限制。最大的挑战是,如果不进行强制转换和其他相对不安全的操作,很难实际使用 BusinessObject 和 EntityObject。

  2. 继承:在这种情况下,您将 BusinessObject 实现为基类,并要求用作参数的所有对象都派生自该基类,与 EntityObject 类似。然后,您可以将实际需要使用的任何方法放在基类中(如有必要,在派生类中覆盖它们。)

  3. 接口:这是两者之间的一半。在这里您说 BusinessObject 和 EntityObject 是接口(传统上它们的名称将以 I 开头,如在 IBusinessObject 等中)在这里您在接口中指定您需要任何 BusinessObject 或 EntityObject 实现的方法,因此可以在您的容器中调用它们目的。

因此,由于您提供的信息有限,无法说出最合适的信息。但是,这些是您的三个基本选择。

于 2011-01-27T21:28:22.807 回答