如何在不实际重载的情况下创建具有重载优势的函数?

Red*_*ces 2 c# asp.net-mvc overloading function

这个项目有2个对象:RegionArea.

两个对象都有一个名为的方法

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对象.

Moo*_*ice 8

听起来你想要一个界面.

public interface IShape
{
    void load();
} 
Run Code Online (Sandbox Code Playgroud)

这既RegionArea将实施:

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)

工厂保持不变,除了包装类而不是区域/区域类.