例如,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,我会这样做吗?班级定义会告诉我的财产等,以及要覆盖的方法。
答案 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 { /* ... */}
等