- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我经常遇到这样的问题:有一个抽象类可以完成所有繁重的工作,然后我有很多多态类可以根据特定需要自定义抽象。抽象通常需要很多参数,所以它们都必须从所有多态类传递
public class FooComplex : AbstractFoo {
public FooComplex(IBarAwesome awesome, IBarCool cool, ...) : base(IBarAwesome awesome, IBarCool cool, ...) { }
...a lot of overriding abstracts
}
public class FooSimple : AbstractFoo
{
public FooSimple(IBarAwesome awesome, IBarCool cool, ...) : base(IBarAwesome awesome, IBarCool cool, ...) { }
...little bit of overriding abstracts
}
public class AbstractFoo
{
public AbstractFoo(IBarAwesome awesome, IBarCool cool, ...)
...heavy lifting
}
我能做些什么来不通过所有这些东西,但能够对它们进行单元测试吗?我一直被教导这样做
var awesome = container.Resolve<IBarAwesome>();
就像说构造函数是不好的做法。
我想找到解决方案的原因是,它使得将任何新内容传递到抽象类变得越来越困难,因为我必须复制相同的参数并将其传递到许多多态子类中。
最佳答案
我相信这与评论中提到的 @C.Evenhuis 相似,将您的构造函数参数抽象到一个通用接口(interface)中,这样它们就可以作为单个构造函数参数传递并易于测试。
具体类:
public class FooComplex : AbstractFoo
{
public FooComplex(ComplexParam complexParam) : base(complexParam)
{}
}
public class FooSimple : AbstractFoo
{
public FooSimple(SimpleParam simpleParam) : base(simpleParam)
{}
}
单个通用具体类(可选)
使用此类,您可以将任何类型传递给继承IParams
的构造函数并可能消除对 FooComplex
的需求和 FooSimple
.
public class Foo<T> : AbstractFoo where T : IParam
{
public Foo(T param) : base(param)
{ }
}
基础抽象类:
public abstract class AbstractFoo
{
protected AbstractFoo(IParam parameter) { }
}
接口(interface):
public interface IBarCool : IBar
{}
public interface IBarAwesome : IBar
{}
public interface IBar
{}
public interface IParam
{
IEnumerable<IBar> Param { get; }
}
可重复使用的具体参数:
我个人不喜欢下面的这种方法,因为它重复了,但我想如果每个类都有自己单独的实现,那就没问题了。另一种选择是只拥有一个名为 ParameterHolder
的类以及适当命名的类的两个实例,例如var complex = new ParameterHolder()
并传递给通用 Foo<T>
.
public class ComplexParam : IParam
{
public IEnumerable<IBar> Param { get; }
public ComplexParam(IEnumerable<IBar> complexParam)
{
Param = complexParam;
}
}
public class SimpleParam : IParam
{
public IEnumerable<IBar> Param { get; }
public SimpleParam(IEnumerable<IBar> simpleParam)
{
Param = simpleParam;
}
}
关于c# - 具有大量 HDI 参数的多态抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906218/
我认为这应该很简单,但尽管网上有大量信息,我还是迷失了方向。 我的问题:我有一个数据点向量,我想为其绘制密度曲线,然后为曲线下的区域着色以表示最高密度区间 (HDI)。当然,我试图通过 ggplot2
我认为这应该很简单,但尽管网上有大量信息,我还是迷失了方向。 我的问题:我有一个数据点向量,我想为其绘制密度曲线,然后为曲线下的区域着色以表示最高密度区间 (HDI)。当然,我试图通过 ggplot2
我经常遇到这样的问题:有一个抽象类可以完成所有繁重的工作,然后我有很多多态类可以根据特定需要自定义抽象。抽象通常需要很多参数,所以它们都必须从所有多态类传递 public class FooCompl
我在将数据从 Azure Blob 存储 csv 文件导入到我的 Spark by Jupyter 笔记本时遇到问题。我正在尝试实现关于 ML 和 Spark 的教程之一。当我像这样填写 Jupyte
我发现在 Pystan 中,HDI 函数可用于提供后验分布周围 95% 的可信区间。然而,他们说它只适用于单峰分布。如果我的模型可能具有多峰分布(最多 4 个峰值),有没有办法在 Pystan 中找到
我正在使用 Azure HDInsight Hadoop 集群 - 集群类型,HDI Ver:Hadoop 2.7 (HDI 3.6)。这不是 Kerberised 集群,因为未启用 ESP。现在我需
这是我的场景。我正在创建 HDI 集群并使用 ARM 模板安装我的自定义应用程序。 我需要使用 Shell 脚本为我的应用程序配置以下值。使用 ARM 模板中的 CustomScript 选项安装我的
我们有 Azure HDI 集群(linux 工作节点),主存储帐户链接到 ADLS gen2 存储。我们使用用户管理身份 (umi) 将 hdi 集群连接到它的主存储。一切正常集群成功运行并在存储中
我已经使用 ARM 模板创建了 HDI 集群。现在HDI集群正在运行。现在我想在现有的 HDI 集群上安装我的 shell 脚本。 我看到大多数示例都在同一模板中安装 HDIcluster + Scr
我已经使用 ARM 模板创建了 HDI 集群。现在HDI集群正在运行。现在我想在现有的 HDI 集群上安装我的 shell 脚本。 我看到大多数示例都在同一模板中安装 HDIcluster + Scr
我正在编写一个 pig 嵌入式 python 脚本,它在 HDInsights 中启动并运行。 I am attempting to add to the python part a conditio
我正在使用 ARM 模板创建 HDI Spark 集群。 "scriptActions": [ { "name": "Install Server", "uri": "ht
我有一个外部自定义 jar,我想与 Azure HDInsight Jupyter 笔记本一起使用; HDI 中的 Jupyter 笔记本使用 Spark Magic 和 Livy。 在笔记本的第一个
我正在 HDI 集群上运行一系列 Spark 作业。我需要 HDI 集群可用于单独的测试运行时间。所以我想使用 Java 执行以下操作 创建 HDI 集群 运行我的测试 删除 HDI 集群 如何在 A
我已经创建了 ARM 模板来部署 Azure VM 和 HDI 集群。我想在部署完成后获取并列出 Azure VM 的公共(public) IP 和 HDI 集群头节点的私有(private) IP。
我已使用 Azure CLI 2.0 和 ARM 模板创建了一个 HDI 群集及其关联的存储帐户。 现在我想使用 Azure CLI 2.0 删除集群。但我没有找到删除它的命令选项。 在 Azure
我目前正在使用 xml.dom.minidom 构建大型 xml 文件,然后通过 toprettyxml 将它们写入文件。有没有办法将 xml 流式传输到文档,因为我遇到了内存错误。 def run(
我们有一个 Azure Hadoop HDI 系统,其中大部分文件都存储在 Azure 存储帐户 Blob 中。从 Hadoop 访问文件需要 WASBS://文件系统类型。 我想配置 SQL 201
我是一名优秀的程序员,十分优秀!