- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我在金融行业的问题领域:
Asset==========Asset parentassetID+ compareTo(Asset anotherAsset)Portfolio : Asset-----------------namerisk limitList stocks+ compareTo(Asset anotherAsset)+ composite.CompareTo(Portfolio, ComparisonRules).Stock : Asset-------marketamountcompany+ compareTo(Asset anotherAsset)AnotherStock : Stock--------------------someOtherProperty+ compareTo(Asset anotherAsset)
我已将复合模式应用于 *股票*s 中的 *Portfolio*s 结构。我想要一种干净的方式来自定义此组合的 compareTo 方法。也就是说,AnotherStock 将始终与另一个 AnotherStock、Stocks 与 Stocks 进行比较。这看起来像是我的策略模式。
我想做类似下面的事情(伪代码)
differences = composite.CompareTo(anotherComposite, ComparisonRules).composite.CompareTo would be something like :ComparisonRules.Compare(this.Stocks[currentAssetID], otherComposite[currentAssetID])
ComparisonRules.Compare(Asset a, Asset b) 会做这样丑陋的事情:
if( a is Stock and b is Stock) : convert to stock and do stock-based comparisonelse if (a is AnotherStock and b is AnotherSTock): convert to AnotherStock
有没有一种编写 ComparisonRules 的方法使我不必向下转换但仍提供自定义 ComparisonRules 对象?
最佳答案
从规则的角度来看,听起来您需要的是泛型。如果您按照以下方式定义某些内容:
public class ComparisonRule<TStock> where TStock : Stock
{
public int Compare(TStock lValue, TStock rValue)
{
...
}
}
这将保证只有等于或低于 TStock
的类型将被接受。例如,如果我有一个 ComparisonRule<AnotherStock>
, 然后只输入等于或低于 AnotherStock
的类型可以传入。但是,如果您希望能够定义一个可以比较 Stock
的规则,您可能需要重新考虑您的类型层次结构。但不是 AnotherStock
.你应该考虑有一个共同的祖先,但具体的种群类型应该在不同的继承树中。
换句话说,你有这个:
Stock
|
--------------------------
| |
OneStock AnotherStock
这将允许您定义一个规则来比较任何 Stock
作为ComparisonRule<Stock>
, 或者只能比较 OneStock
的规则作为ComparisonRule<OneStock>
.
然而,这并不能帮助您理清如何知道哪个 Stock
将对象传递给更高级别的规则。为此,您需要能够定义一个不太具体的版本 ComparisonRule
我们可以用一个界面来做到这一点:
public interface IComparisonRule
{
bool CanCompare(Stock lValue, Stock rValue);
int Compare(Stock lValue, Stock rValue);
}
public abstract class ComparisonRule<TStock> : IComparisonRule where TStock : Stock
{
bool IComparisonRule.CanCompare(Stock lValue, Stock rValue)
{
return lValue is TStock && rValue is TStock;
}
int IComparisonRule.Compare(Stock lValue, Stock rValue)
{
return Compare((TStock)lValue, (TStock)rValue);
}
public abstract int Compare(TStock lValue, TStock rValue);
}
现在,严格来说,您的问题是问如何在不向下转型的情况下做到这一点,这(再次严格来说)是不可能的。但是,这应该使您不必在每次实现时都这样做。例如,比较两个 AnotherStock
的简单规则实例将是:
public class MyRule : ComparisonRule<AnotherStock>
{
public override int Compare(AnotherStock lValue, AnotherStock rValue)
{
return lValue.someOtherProperty.CompareTo(rValue.someOtherProperty);
}
}
在更高级别(即在 Portfolio
内),您可以简单地保留 IComparisonRule
的列表按照你的规则,那么你可以调用CanCompare
并传入两个 Stock
实例以查看它是否是有效比较,然后将它们传递给 Compare
以便进行比较。
关于c# - 想要避免在传递给 Composite 的 Strategy 中向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7135557/
在大多数示例中,策略模式通常适用于压缩算法/编解码器算法,其中这些算法可能具有完全不同的代码。 但是,在我的例子中,我想重构为策略模式的统计算法有 50% 的代码相似或完全相同。我想知道人们如何处理这
git merge选项有什么区别--strategy-option(短-X)和--strategy(短-s)? 有很多关于 merge strategies 的问题.但是没有人解释这些选项之间的区别。
耦合策略和非耦合策略有什么区别? 谢谢回答。 最佳答案 当策略类知道上下文时,或者当客户端知道策略具体类时,策略是耦合的。 我们可以阅读 here (有一些小的修改): Usually each st
我是 hibernate 新手。我不明白以下两种主键生成策略: 身份 顺序 有人能解释一下这两者是如何工作的吗?这两者有什么区别? 最佳答案 引用 Java Persistence/Identity
我正在尝试调试我在编写内核时遇到的链接器问题。 问题是我有一个变量 SCAN_CODE_MAPPING我无法使用 - 它似乎是空的或其他东西。我可以通过改变我链接程序的方式来解决这个问题,但我不知道为
今天,当我找到一种方法来破坏我们程序中的某些功能时,我正在为客户做一些事情。 (代码实际上是遗留代码,它已经开发了大约 10 年,而我在这里只工作了大约一年。) 它不会导致错误或导致程序崩溃,但如果用
我想使用 Strategy Pattern为第三方类中的成员实现一些定制的格式化行为。我希望第三方只需注释类成员以指示他们是否应该使用格式策略(A、B 或 C),然后使用他们类的实例调用我的“格式”函
我试图将 CopyOnWriteArrayList 理解为我的代码: 我的代码是: public class AuditService { private CopyOnWriteArrayLi
在 git 中,我有一个 master 分支,我在其中开发我的应用程序。除了应用程序,我还需要开发它的演示版本。 我考虑过为 demo 创建一个永远不会 merge 到 master 中的单独分支。主
1、意图 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法 2、策略模式结构图 3、策略模式中主要
抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法。 具体策略(Concre
模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行 模板模式属于行为型模式 摘要 1、
我希望这是一个可以接受的问题。我理解递归的思维模式,我想考虑基本情况,然后是递归情况,但是对于一些更困难的 BST 问题,我只是画了空白,感觉就像我迷失了方向而没有一个好的方向。 例如,对于链表,似乎
是否有人考虑过为 Azure 存储队列实现策略,允许以任意顺序(除了先进先出)使消息出队。例如,有些人可能对 LIFO 感兴趣,有些人可能希望在不太重要的消息之前将“重要”消息出队,等等。 就我个人而
虽然多线程在某些情况下速度更快,但有时我们只想生成多个工作进程来完成工作。这样做的好处是,如果其中一个 worker 崩溃,主应用程序不会崩溃,而且用户不需要太担心互锁问题。 COM+ 的 Appli
我的应用程序将对我的对象有不同的策略。实现这一目标的最佳方法是什么?理想情况下,我想从某些关系数据库动态加载策略实现。但我不知道该怎么做。最好的方法是什么? 例如,假设我们要将策略 Strategy1
上下文 首先,感谢您的假设。它既非常强大又非常有用! 我编写了一个假设策略来生成以下形式的单调(ANDS 和 OR)策略表达式: (A and (B or C)) 这可以被认为是一个树结构,其中 A、
问题 我有一个大类(大约 1500 LOC),它使用不同的“策略”将数据从一个对象转换到另一个对象。我在这里有那个类的表示: public class FooService implements Fo
我正在阅读 Effective Java。在讨论使用函数对象作为策略的部分中,存在以下段落。 Because the strategy interface serves as a type for a
我是 C# 4.0 和 WPF 的新手,我正准备开始一个新的应用程序。 来自 C++/MFC 世界,我对测试与最新技术一起使用的策略很感兴趣。 例如: 单元测试 功能测试 界面测试 其他? 如有任何建
我是一名优秀的程序员,十分优秀!