- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此项目中有 2 个对象:Region
和 Area
。
两个对象都有一个方法叫做
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();
}
Region
和 Area
都将实现:
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/
我是一名优秀的程序员,十分优秀!