Red*_*ces 2 c# asp.net-mvc overloading function
这个项目有2个对象:Region和Area.
两个对象都有一个名为的方法
void load();
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,不确定它是否可能:
Detail根据称为函数的对象调用具有类似实现的相同函数.
该Detail函数将执行以下操作:
void Detail(parameter)
{
object_name.load();
}
Run Code Online (Sandbox Code Playgroud)
我不想为每个对象编写2个重载函数,因为那时我将有2个函数具有几乎相同的实现.
我试过了:
void Detail(string land)
{
if(land=="region")
{
Region land = new Region();
}
else if(land=="area")
{
Area land = new Area();
}
land.load();
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为land.load()会导致错误,因为函数无法确定土地是一个Region还是一个Area对象.
听起来你想要一个界面.
public interface IShape
{
void load();
}
Run Code Online (Sandbox Code Playgroud)
这既Region与Area将实施:
public class Region : IShape
{
public void load() { /* Region Implementation */ }
}
public class Area : IShape
{
public void load() { /* Area Implementation */ }
}
Run Code Online (Sandbox Code Playgroud)
您的详细信息功能现在如下所示:
void Detail(IShape shape)
{
shape.load();
}
Run Code Online (Sandbox Code Playgroud)
一些说明:
接口定义了一个没有实现的契约.你的函数不需要知道它是一个还是一个有问题的类遵守定义的合同,即它有一个方法.DetailAreaRegionIShapeload()
编辑
更仔细地看待你的问题,看起来你想要实现一个工厂.所以我们也这样做.
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]();
}
}
Run Code Online (Sandbox Code Playgroud)
这使您的细节功能变得相当简单:
void Detail(string shape)
{
ShapeFactory.Create(shape).load();
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,省略了错误检查.那这是做什么的呢?嗯,工厂是 - 好 - 工厂.我们创建一个字典(按名称键入),其值是一个返回的函数IShape..我们现在可以通过名称动态创建形状并load在其上调用方法.
编辑2
鉴于您的评论不能改变这些类实现的接口,我们没有理由不能混淆加载方法(假设它们都实现了它).我们所要做的就是再次使用我们的界面:
public interface IShapeWrapper
{
void load();
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们的界面仍然相同.什么是不同的是,实现:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
工厂保持不变,除了包装类而不是区域/区域类.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |