我在这里(或两者都不需要)抽象类或接口吗?

时间:2009-03-25 18:16:35

标签: c# oop interface abstract-class

我有一个仓库。有时我想通过名称,有时通过描述,有时通过UPC,可能是其他东西等来查找框位置。这些查找方法中的每一个都调用相同的各种私有方法来查找信息以帮助定位数据。

例如,upc调用私有方法来查找rowid,名称也是如此,X也是如此。所以我需要为所有这些方法使用该方法。我可能会以某种方式使用该rowid来查找货架位置(这只是一个示例。)

但我的问题是我应该有一个抽象类(或其他东西)因为我以不同的方式查找我的盒子。

换句话说,我的查找代码与UPC和位置非常相似。每种方法都可以调用某些东西(select * from xxxx where location =,或select * from xxxx where upc =)。我可以在同一个类中创建两个不同的方法

LocateByUPC(string upc)...
LocateByLocation(string location)...
LocateByDescription(string description)

......再次,这将是一个大班

我是否有理由想要一个能够举办

的超级课程?
abstract class MySuper
{

properties...

LocateBox(string mycriteria)...

}

然后继承它并创建第二个类来覆盖我需要的任何版本的LocateBox方法?

我不知道为什么我想要这样做而不是它看起来像OOD,这真的意味着如果我有充分的理由我会这样做。但是,我知道没有优势。我发现我的类变得越来越大,我只是稍微改变了方法的名称和一些代码,这让我觉得继承可能会更好。

如果重要,请使用C#。

编辑 - 如果我只给某人一个没有源但除了类定义的.dll,我会这样做吗?班级定义会告诉我的财产等,以及要覆盖的方法。

8 个答案:

答案 0 :(得分:2)

既不

既不使用抽象类也不使用接口会简化协议,即你仍然会得到一堆LocateXXX方法

我建议使用通用的Locate(字符串条件)方法作为基础,并且只为您知道经常使用的方法定义专门的方法签名;如果您需要它,并且依赖于通用的简化编码和测试,通用可以成为未来扩展的全能产品。

答案 1 :(得分:1)

听起来您可能想要实现名为Template Method的设计模式。基本上,您将基类中的查找算法的轮廓定义为最终方法,将公共代码放在这些方法中。对于根据类型需要不同行为的方法,只需让基类的final方法在子节点中调用受保护的方法,并让每个子类型实现该行为。

您可以在线查看某些资源,只需在谷歌搜索模板方法设计模式。希望它能为你的问题提供一些启示。

答案 2 :(得分:0)

当您有多个实现时,抽象会有所帮助。并且为了面向未来(希望更新的实施将会出现)。接口充当客户端和实现者之间的契约。这是一个不变的。实现可以自由添加他们希望的任意数量的方法。你有这样的需求吗?

这有助于回答您的问题吗?

答案 3 :(得分:0)

你提议的是(基本上)Strategy pattern。我不想链接到维基百科,但它至少是一个好的起点。看一下利弊,看看它对你有益。

我认为你不需要这样做。您可以简单地将LocateBox方法公开,并根据您要执行的搜索调用私有帮助程序。仅仅为了使用一些OO设计原则,过度复杂化您的类结构通常是个坏主意。等到你找到 need ,然后适当地进行重构。这有助于指出真正需要什么,浪费你的时间。

编辑:我想到的另一种方法是创建一个数据类,该数据类具有基于您可以搜索的各种内容的属性。 IE浏览器。一个BoxSearchData类,它具有UPC等属性,然后将其传递给LocateBox(),并根据null属性构造查询。这将有助于您在以后的多个标准上构建搜索。

答案 4 :(得分:0)

在我看来似乎没有必要。只需拥有一个具有不同搜索功能的存储库。然后只需在需要时使用您需要的功能。

但是,如果您有排队不同类型搜索的工具,那么界面部分才会有用。然后你可以让工厂创建所有实现接口的不同类型的搜索类。此时,您可以枚举排队的Search类,强制转换为接口,并执行虚拟的函数并指向正确的搜索类型。示例:ReturnDataObject GetItem(object param);

另外,在提取数据时,接口还有其他用途。这只是我想到的第一个例子。

答案 5 :(得分:0)

在这个例子中,仔细观察,您会看到只有用于查找的属性发生了变化。当以OO方式表示时,你最终会得到一个我称之为“Lookup”的类(代表搜索,可能是SQL,可能是另一种查询语言:一个可以根据某些属性返回rowId并搜索到的对象该财产的价值。

真正的行为改变将在查询语言中。因此,如果要创建抽象类或接口,它应该用于此目的。可以通过在查询调用中添加“property”参数来分离对属性和值变化的关注。

答案 6 :(得分:0)

当您需要大量的抽象类时,抽象类很有用 功能在子类中是相同的,例如在a 有多种付款方式的购物车,你可以 有一个抽象类,定义了一般的付款方式,和 让子类继承每个实际付款的超类 你想支持的方法(贝宝,信用卡,账户等)。该 关于如何授权付款的机制对于每个都是不同的 子类,但它们都执行基本相同的功能 - 它们 验证用户是否可以证明他们可以支付货物或 有问题的服务。

接口有用的示例是您不相关的地方 需要在制服中提供某些类似功能的项目 办法。例如,您可能有一个CMS,其中的文章存储在一个 数据库,但系统将它们缓存到光盘以及HTML 页面直到数据库中的文章被修改,此时 物理文件将被删除,直到下次有人访问 复制到数据库中。您的CMS也可能支持 用户上传图像,PDF等以存储以便在光盘上访问, 但你绝对不希望这些文件作为副本被删除 光盘代表文件本身而不是缓存版本。在这 例如,你可以创建一个Cacheable接口来说明什么方法 缓存到光盘的类需要实现,同时将其保留 到了班级本身来实现它们。这更有意义 代表不同类型数据的类几乎肯定需要 以不同方式实现他们的缓存方案(如果有的话)。

每个允许缓存的类都将被定义为Class 实现Cacheable,然后你可以检查它 你的代码。经验不足的编码员可能会测试一个对象的类 他们正在通过获取类和处理结果来工作 有一个很大的转换声明。这不是正确的方法,因为 它意味着您假设某些类对象实现 某些功能,如果您向系统添加新类 需要修改软件中的每个switch语句才能将其带入 帐户。如果你实现一个接口,你可以测试一个对象 实现与instanceof关键字的接口。

if ($thisObject instanceof Cacheable)
{
// Manage item's cache
}

这种方法更好,因为它消除了switch语句和 从而使您的软件更易于维护。如果添加新类 到那个也实现自己的缓存方案的系统 只需要声明它实现了Cacheable。作为界面 要求所有类实现它以声明指定的方法 在界面中,您可以确定任何实现的类 Cacheable将提供您使用的某些方法。你的代码 不需要知道类如何实现这些方法,就是这样 它确实实现了它们。

这些概念的解释比实际学习要复杂一些 使用我很害怕,希望我已经掌握了基本的想法 足以让你自己解决这些问题。

答案 7 :(得分:0)

显然,这里的多态实体是约束。使用string是实现相同的快速而又脏的方法,但是你的类型系统完全不在循环中,垃圾字符串值对于输入和有意义的约束规范一样有效。

所以,

LocateBy (Constraint constraint);

abstract class Constraint {
   String toString ();
}

class LocationConstraint extends Constraint { /* ... */}

相关问题