我在一个项目中有一系列课程,这些课程本质上都做得相同,但是在不同的对象上。由于其中一些是在不同的时间进行编码的,而不同的人在命名中存在一些不一致之处。我想以某种方式更新代码,该方式不仅可以在当前对象中,而且还可以在将来创建的新对象中执行一些一致性。我对编程的理解使我相信我需要基础类或界面,但我不知道如何使两种工作。我想要的方法是:

internal BusinessObject MethodA(EntityObject entity)
internal Void MethodB(EntityContext context, BusinessObject obj, EntityObject entity)

我遇到的问题是,在每个类中,“ BusinessObject”和“ EntityObject”将是不同的,例如,它可能是“ carobject and Carentity”,而在另一个中,它将是“ busobject and Busentity”。我仍然想要这两种方法,我仍然希望它们命名为Methoda和MethodB,我只想交换实现中的实际对象类型。实现本身会有所不同,因为它们正在使用不同的对象。

我知道在编译时的对象类型,并且需要能够访问对象的属性,因此,如果使用了仿制药,则需要将仿制药作为实现中的正确类型施放。同样,Methoda的实现需要创建一个“新的” BusinessObject IE“” BusinessObject X = new BusinessObject(),如果有任何区别。

我尝试在方法中使用与仿制药的接口,以及带有抽象方法的基类,但我无法弄清楚如何工作。

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

有帮助吗?

解决方案

仿制药是一种方式

因此,我会沿着这些行声明接口(如果您喜欢该路线(如果您喜欢该路线)):

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
{
...
}

其他提示

只是为了用抽象基类展示解决方案,请参阅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) {...}
}

实际上有三种方法:

  1. 仿制药:您以独立于BusinessObject和EntityObject的类型来指定容器对象的位置。您可以将其扩展一点以对通用对象的类型进行限制,而通用对象作为具有通用约束的参数。最大的挑战是,在没有铸造和其他相对不安全的操作的情况下,很难实际使用BusinessObject和EntityObject。

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

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

因此,有了有限的信息,您不可能说哪个最合适。但是,这些是您的三个基本选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top