如何在c#中以更通用的方式编写这些方法?

时间:2015-11-20 09:08:55

标签: c# generics polymorphism

我有以下类层次结构:

EstadoBaseMO(父母)

  • EstadoSAMO(EstadoBaseMO child)
  • EstadoGesDocMO(EstadoBaseMO child)

SolicitudBasePresenter(父)

  • SolicitudGesDocPresenter(SolicitudBasePresenter child)
  • SolicitudSAPresenter(SolicitudBasePresenter child)

EstadoBaseBO(父)

  • EstadoGesDocBO(EstadoBaseBO child)
  • EstadoSABO(EstadoBaseBO child)

我需要实现一个名为SaveNewDetailStates的方法,SolicitudBasePresente中的以下实现是

public bool SaveNewDetailStates(List<EstadoBaseMO> estados)
    {
        bool result = true;

        if (estados.Any())
        {
            try
            {
                EstadoGesDocBO bo = new EstadoGesDocBO();

                foreach (var estado in estados)
                {

                    var savedState = bo.Insert(estado);
                    result &= ((savedState != null) && (savedState.Id != estado.Id));
                }
            }
            catch (Exception ex)
            {
                result = false;
            }
        }
        return result;
    }

SolicitudGesDocPresenter.SaveNewDetailStates实施

public bool SaveNewDetailStates(List<EstadoGesDocMO> estados)
    {
        bool result = true;

        if (estados.Any())
        {
            try
            {
                EstadoGesDocBO bo = new EstadoGesDocBO();

                foreach (var estado in estados)
                {

                    var savedState = bo.Insert(estado);
                    result &= ((savedState != null) && (savedState.Id != estado.Id));
                }
            }
            catch (Exception ex)
            {
                result = false;
            }
        }
        return result;
    }

SolicitudSAPresenter.SaveNewDetailStates实施

 public bool SaveNewDetailStates(List<EstadoSAMO> estados)
    {
        bool result = true;

        if (estados.Any())
        {
            try
            {
                EstadoSABO bo = new EstadoSABO();

                foreach (var estado in estados)
                {

                    var savedState = bo.Insert(estado);
                    result &= ((savedState != null) && (savedState.Id != estado.Id));
                }
            }
            catch (Exception ex)
            {
                result = false;
            }
        }
        return result;
    }

正如您所看到的,代码与SolicitudSAPresenter我使用EstadoSAMOEstadoSABO类的两个差异完全相同,类似于SolicitudGesDocPresenter 。 要了解的事情:

  • 我真的不需要SolicitudBasePresenter.SaveNewDetailStates
  • 的实施
  • 我尝试将父方法(SolicitudBasePresenter.SaveNewDetailStates)转换为抽象方法,但是SAPresenterGesDocPresenter无法使用覆盖,因为他们需要实现同样的签名(并且它不一样......),此外,在我意识到我需要SolicitudBasePresenter的具体实现后不久,所以它不应该是一个抽象类(类似于虚方法)
  • 也许使用泛型可以解决这个问题,但我还是不习惯它们。我试过像SaveNewDetailStates<T,K>(List<T> estados)这样的东西,但后来我迷路了,我不知道还能做些什么。

编写此代码的最佳方法是什么?

我唯一的解决方案是从父节目主持人中删除SaveNewDetailStates,并在儿童中写出具体的实现,然后一切都很好但是...我不认为这甚至是一个优秀的开发人员的解决方案..

2 个答案:

答案 0 :(得分:5)

您需要使用泛型。定义类EstadoBaseMO<T>,然后在保存方法中使用类型T

public bool SaveNewDetailStates(List<T> estados) 

您的子课程可以(例如)延长EstadoBaseMO<SolicitudBasePresenter>

网上有很多泛型教程,看看其中的一些。

https://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

答案 1 :(得分:0)

你可以使用Generics但是你仍然需要使用Interfaces来实现你需要的东西,但你只能使用与此类似的Interfeces,我制作了单独的IEstadoState和IEstadoMO,以便在你不需要额外的时候更清楚在你的逻辑中你可以创建一个界面而不是这两个

public interface IEstadoState 
{
    int Id { get; set; }
}

public interface IEstadoMO
{
    int Id { get; set; }
}

public interface IEstadoBO
{
    IEstadoState Insert(IEstadoMO estadoMO);
}

public class SolicitudBasePresenter
{
    public virtual bool SaveNewDetailStates(List<IEstadoMO> estados, IEstadoBO estadoBO) 
    {
        bool result = true;

        if (estados.Any())
        {
            try
            {
                foreach (var estado in estados)
                {

                    var savedState = estadoBO.Insert(estado);
                    result &= ((savedState != null) && (savedState.Id != estado.Id));
                }
            }
            catch (Exception ex)
            {
                result = false;
            }
        }
        return result;
    }
}

public class SolicitudGesDocPresenter : SolicitudBasePresenter { }

public class SolicitudSAPresenter : SolicitudBasePresenter { }

如果您更喜欢使用Generic或者不想将第二个参数传递给方法,那么它的外观是什么

public class SolicitudBasePresenter<T1, T2> where T1 : IEstadoMO where T2 : IEstadoBO, new()
{
    public bool SaveNewDetailStates(List<T1> estados) 
    {
        bool result = true;

        if (estados.Any())
        {
            try
            {
                foreach (var estado in estados)
                {
                    var estadoBO = new T2();
                    var savedState = estadoBO.Insert(estado);
                    result &= ((savedState != null) && (savedState.Id != estado.Id));
                }
            }
            catch (Exception ex)
            {
                result = false;
            }
        }
        return result;
    }
}

public class EstadoState : IEstadoState
{
    public int Id {get; set;}
}

public class EstadoBaseMO : IEstadoMO
{
    public int Id { get; set; }
}

public class EstadoBaseBO : IEstadoBO
{
    public IEstadoState Insert(IEstadoMO estado) { return new EstadoState(); }
}

public class EstadoSAMO : EstadoBaseMO { }

public class EstadoGesDocMO : EstadoBaseMO { }

public class EstadoGesDocBO : EstadoBaseBO { }

public class EstadoSABO : EstadoBaseBO { }

public class SolicitudGesDocPresenter : SolicitudBasePresenter<EstadoGesDocMO, EstadoGesDocBO> { }

public class SolicitudSAPresenter : SolicitudBasePresenter<EstadoSAMO, EstadoSABO> { }

你的方法调用将是

    var docPresenter = new SolicitudGesDocPresenter();
    docPresenter.SaveNewDetailStates(new List<EstadoGesDocMO>());

你也可以宣布像这样的孩子

public class SolicitudGesDocPresenter<T1, T2> : SolicitudBasePresenter<T1, T2> where T1 : IEstadoMO where T2 : IEstadoBO, new() { }

public class SolicitudSAPresenter<T1, T2> : SolicitudBasePresenter<T1, T2> where T1 : IEstadoMO where T2 : IEstadoBO, new() { }

你会以这种方式称呼它

    var docPresenter = new SolicitudGesDocPresenter<EstadoGesDocMO, EstadoGesDocBO>();
    docPresenter.SaveNewDetailStates(new List<EstadoGesDocMO>());