gpt4 book ai didi

c# - 具有大量 HDI 参数的多态抽象类

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:37 24 4
gpt4 key购买 nike

我经常遇到这样的问题:有一个抽象类可以完成所有繁重的工作,然后我有很多多态类可以根据特定需要自定义抽象。抽象通常需要很多参数,所以它们都必须从所有多态类传递

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com