覆盖方法之前的C#调用方法

时间:2016-12-28 09:16:38

标签: c# design-patterns

美好的一天, 我有一个基类,每个实现都需要覆盖一个虚方法,但我想在覆盖之前先调用基本方法。 有没有办法实现这一点,而无需实际调用该方法。

public class Base
{
    public virtual void Method()
    {
        //doing some stuff here 
    }
}

public class Parent : Base
{
    public override void Method()
    {
        base.Method() //need to be called ALWAYS
        //then I do my thing 
    } 
}

我不能总是依赖于base.Method()将在覆盖中调用,所以我想以某种方式强制执行它。这可能是某种设计模式,任何完成结果的方法都可以。

2 个答案:

答案 0 :(得分:3)

一种方法是在基类中定义一个public方法,该方法调用另一个可以(或必须)覆盖的方法:

public class Base
{
     public void Method()
     {
        // Do some preparatory stuff here, then call a method that might be overridden
        MethodImpl()
     }

     protected virtual void MethodImpl() // Not accessible apart from child classes
     {      
     }
}

public class Parent : Base
{
    protected override void MethodImpl()
    {
       // ToDo - implement to taste
    } 
}

答案 1 :(得分:0)

您可以使用装饰器设计模式,应用此模式可以动态地将附加职责附加到对象。装饰器为子类化提供了灵活的替代扩展功能:

public String obtenerLatitudLongitud (String direccion) throws Exception{

    try {
        GeoApiContext context = new GeoApiContext().setApiKey(this.propiedades.get(ConstantesApi.KEY_MAPS_GOOGLE));
        context.setQueryRateLimit(50);
        GeocodingResult[] results =  GeocodingApi.geocode(context,direccion).await();
        latLong = results[0].geometry.location.toString();
        logger.debug("Latitud, longitud   : "  + latLong);
    } catch (Exception e) {
        logger.error("Error Normalizando la direccion :  "  +  direccion  +  "  " + e.getMessage());
    }

    return latLong;
}

希望这有帮助!