gpt4 book ai didi

c# - 如何在不实际重载的情况下创建具有重载好处的函数?

转载 作者:行者123 更新时间:2023-11-30 19:09:55 24 4
gpt4 key购买 nike

此项目中有 2 个对象:RegionArea

两个对象都有一个方法叫做

void load();

这是我想要的,不确定是否可行:

根据调用函数的对象调用具有相似实现的相同 Detail 函数。

Detail 函数将执行如下操作:

void Detail(parameter)
{
object_name.load();
}

我不想为每个对象编写 2 个重载函数,因为这样我就会有 2 个实现几乎相同的函数。

我试过:

void Detail(string land)
{
if(land=="region")
{
Region land = new Region();
}
else if(land=="area")
{
Area land = new Area();
}

land.load();
}

但这不起作用,因为 land.load() 会导致错误,因为该函数无法在定义时确定土地是 Region 还是 区域对象。

最佳答案

听起来你想要一个界面。

public interface IShape
{
void load();
}

RegionArea 都将实现:

public class Region : IShape
{
public void load() { /* Region Implementation */ }
}

public class Area : IShape
{
public void load() { /* Area Implementation */ }
}

你的 detail 函数现在看起来像这样:

void Detail(IShape shape)
{
shape.load();
}

一些注意事项:

接口(interface)定义了一个没有实现契约。您的 Detail 函数不需要知道它是 Area 还是 Region,前提是相关类遵守 的约定IShape 定义,即 - 它有一个 load() 方法。

编辑

仔细查看您的问题,您似乎也想实现一个工厂。因此,让我们也这样做吧。

public static class ShapeFactory
{
private static Dictionary<string, Func<IShape>> _shapes = new Dictionary<string, Func<IShape>>();

static ShapeFactory()
{
// Register some creators:
_shapes.Add("region", () => return new Region());
_shapes.Add("area", () => return new Area());
}

public static IShape Create(string shape)
{
return _shapes[shape]();
}
}

这让您的 detail 函数变得相当简单:

void Detail(string shape)
{
ShapeFactory.Create(shape).load();
}

为简洁起见省略了错误检查。那么这是做什么的呢?好吧,工厂就是——好吧——工厂。我们创建了一个字典(以名称为键),其值是一个返回 IShape 的函数。我们现在可以按名称动态创建形状并调用 load 方法

编辑2

考虑到您不能更改这些类实现的接口(interface)的评论,我们没有理由仍然不能混淆加载方法(假设它们都实现了它)。我们所要做的就是再次使用我们的界面:

public interface IShapeWrapper
{
void load();
}

注意我们的界面还是一样的。 的不同之处在于实现:

public class RegionWrapper : IShapeWrapper
{
private Region _region;
public RegionWrapper()
{
_region = new Region();
}

public void load()
{
_region.load();
}
}


public class AreaWrapper : IShapeWrapper
{
private Area _area;
public AreaWrapper()
{
_area = new Area();
}

public void load()
{
_area.load();
}
}

除了采用包装类而不是 Area/Region 类之外,工厂基本保持不变。

关于c# - 如何在不实际重载的情况下创建具有重载好处的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21173196/

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