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

Tha*_*hal 2 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;
    }
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,代码完全相同,有两个不同之处,在SolicitudSAPresenter我使用EstadoSAMO和EstadoSABO类中,类似于SolicitudGesDocPresenter.要知道的事情:

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

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

我唯一的解决方案是SaveNewDetailStates从父级演示者中删除,并在子级中编写具体的实现,然后一切都很好但是...我认为这甚至不是一个好的开发人员的解决方案..

Tim*_*m B 5

你需要使用泛型.定义类EstadoBaseMO<T>,然后T在save方法中使用类型.

public bool SaveNewDetailStates(List<T> estados) 
Run Code Online (Sandbox Code Playgroud)

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

在线有很多泛型教程,看看其中的一些.

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