gpt4 book ai didi

C#泛型重构

转载 作者:太空狗 更新时间:2023-10-29 21:56:04 25 4
gpt4 key购买 nike

我正在尝试重构一段看起来很容易重构但事实证明很难重构的代码。有两种方法看起来非常相似,我觉得应该重构:-

public class MyClass
{
private void AddBasicData(Receiver receiver)
{
var aHelper = new AHelper();
var bHelper = new BHelper();
var cHelper = new CHelper();
receiver.ObjA = aHelper.GetBasic();
receiver.ObjB = bHelper.GetBasic();
receiver.ObjC = cHelper.GetBasic();
}

private void AddExistingData(Receiver receiver)
{
var aHelper = new AHelper();
var bHelper = new BHelper();
var cHelper = new CHelper();
receiver.ObjA = aHelper.GetExisting();
receiver.ObjB = bHelper.GetExisting();
receiver.ObjC = cHelper.GetExisting();
}
}

这个类的引用代码在这里...

public class AHelper : Helper<A> 
{
}

public class BHelper : Helper<B>
{
}

public class CHelper : Helper<C>
{
}

public class Helper<T> : IHelper<T> where T : IMyObj
{
public T GetBasic()
{
...
}

public T GetExisting()
{
...
}
}

public interface IHelper<T>
{
T GetBasic();
T GetExisting();
}

public class A : IMyObj {}
public class B : IMyObj {}
public class C : IMyObj {}

public interface IMyObj {}

public class Receiver
{
public A ObjA { get; set; }
public B ObjB { get; set; }
public C ObjC { get; set; }
}

我的第一次尝试是像这样重构......

public class MyClass
{
private void AddBasicData(Receiver receiver)
{
Func<Helper<IMyObj>, IMyObj> func = x => x.GetBasic();
AddData(receiver, func);
}

private void AddExistingData(Receiver receiver)
{
Func<Helper<IMyObj>, IMyObj> func = x => x.GetExisting();
AddData(receiver, func);
}

private void AddData(Receiver receiver, Func<Helper<IMyObj>, IMyObj> func)
{
var aHelper = new AHelper();
var bHelper = new BHelper();
var cHelper = new CHelper();
receiver.ObjA = func(aHelper);
receiver.ObjB = func(bHelper);
receiver.ObjC = func(cHelper);
}
}

问题是像 new AHelper() 这样的对象不可分配给 Helper<IMyObj> :-(

谁能看到如何很好地重构它?

提前致谢

罗素

最佳答案

尝试使用模板函数。它应该根据您传递的参数类型推断类型,因此您不需要在 AddData 调用中显式指定类型。

public class MyClass
{

private void AddData<T>(Receiver receiver, Func<Helper<T>, T> func)
{
var aHelper = new AHelper();
var bHelper = new BHelper();
var cHelper = new CHelper();
receiver.ObjA = func(aHelper);
receiver.ObjB = func(bHelper);
receiver.ObjC = func(cHelper);
}
}

尝试 #2:棘手的问题我认为您需要一个更通用的 IHelper 接口(interface)。这样的事情会有帮助吗?

public interface IHelper
{
IMyObj GetBasic();
IMyObj GetExisting();
}

public interface IHelper<T> : IHelper
{
T GetBasic();
T GetExisting();
}

你必须解决派生接口(interface)和基接口(interface)之间的名称冲突,但我不确定你到底想怎么做,而且我的时间不多了,所以我'暂时保留它。

尝试 #3(我决心要做到这一点!):这会是作弊吗?

  public enum RetrievalMethod
{
Basic,
Existing
}
public class Helper<T> : IHelper<T> where T : IMyObj
{

public T Get(RetrievalMethod rm)
{
switch(rm)
{
case RetrievalMethod.Basic:
return GetBasic();
case RetrievalMethod.Existing:
return GetExisting();
}
}
...
}
...
private void AddData(Receiver receiver, RetrievalMethod rm)
{
var aHelper = new AHelper();
var bHelper = new BHelper();
var cHelper = new CHelper();
receiver.ObjA = aHelper.Get(rm);
receiver.ObjB = bHelper.Get(rm);
receiver.ObjC = cHelper.Get(rm);
}

关于C#泛型重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1244077/

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