【问题标题】:OOP Class DesignOOP 类设计
【发布时间】:2014-04-23 02:26:24
【问题描述】:

我有这个代码,

public abstract class BaseClass
{
    public object CommonMethod<T>()
    {
        //Common code

        CustomMethod(); //Call child method

        return (T)CustomObject;
    }

    internal abstract void CustomMethod();
}


public class ChildClass : BaseClass
{
    public MyDTO CommonMethod()
    {
        return (MyDTO)base.CommonMethod<MyDTO>(); //Call Base class common code
    }

    internal override void CustomMethod()
    {
        //Custom Code, specific to child class
    }
}

我有一些公共代码放在基类 (BaseClass.CommonMethod) 中, 但最后同样的方法应该运行子类特定的代码(ChildClass.CustomMethod)。

这个实现是正确的还是有任何其他首选/更好的实现来实现这个?

编辑

最终代码(根据答案更新):

public abstract class BaseClass<T> where T : IDTO
{
    public T CommonMethod()
    {
        //Common code

        CustomMethod(); //Call child method

        return (T)CustomObject;
    }

    internal abstract void CustomMethod();
}


public class ChildClass : BaseClass<MyDTO>
{
    internal override void CustomMethod()
    {
        //Custom Code, specific to child class
    }
}

【问题讨论】:

  • 如果很常见,为什么还要给孩子戴上?
  • @AD.Net 实际上,只有代码的公共部分被移到 BaseClass 中,但其余部分仍在 shild 类中。..

标签: c# oop


【解决方案1】:

稍作修正,您的代码看起来不错。但是,如果将返回值设置为 T,则不需要覆盖 CommonMethod:

public abstract class BaseClass<T>
{
    public T CommonMethod()
    {
        //Common code

        T result = CustomMethod(); //Call child method

        return result;
    }

    internal abstract T CustomMethod();
}

public class ChildClass : BaseClass<MyDTO>
{
    internal override MyDTO CustomMethod()
    {
        //Custom Code, specific to child class
    }
}

在我的示例中,我假设您从 CustomMethod 返回 CustomObject,否则我不太确定您从哪里获取此对象。

【讨论】:

  • 对不起,我的实际CommonMethod 有参数要从子类传入,所以我想没有办法删除覆盖...
  • 从 BaseClass CommonMethod 中删除了 CommonMethod 并使用抽象属性访问参数数据。谢谢...
【解决方案2】:

我认为您不需要转换 (MyDTO)base.CommonMethod&lt;MyDTO&gt;();,因为您的基本方法已经在转换结果。

您需要确保 CustomObject 可以转换为 T,这对我来说有点可疑。

CustomerObject 必须继承自MyDTO,因此T 必须实现MyDTO我认为

【讨论】:

  • 关于“确保 CustomObject 可以转换为 T”,public object CommonMethod&lt;T&gt;() where T : IDTO 之类的东西会解决这个问题,对吧??
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多