我如何设计特定的超类

时间:2012-02-20 13:30:05

标签: c# oop inheritance

我正在尝试重构一个解决方案以引入另一个项目。 我有一个Core项目,其中包含项目中的公共类。

我试图通过使用2个想象的项目来简化我的问题:假期和天气......

我有一个Holidays项目的文件加载过程设置,它有以下两个类:

public class Job
{
    public virtual string CreatedBy { get; set; }
    public virtual DateTime? CreatedDate { get; set; }
    public virtual Security Security { get; set; }

    protected IList<File> _files = new List<File>();
    public virtual IEnumerable<File> Files
    {
        get { return _files; }
    }
}

public class File
{
    public virtual string FileName { get; set; }
    public virtual FileType FileType { get; set; }
    public virtual FileStatusType FileStatusType { get; set; }
    public virtual Job Job { get; set; }
}

Weather项目的文件加载过程与Holidays完全相同,只是Jobs类没有Security属性。

我的问题是,是否有可能以某种方式将两个类移动到Core项目中以允许两个项目都使用它们? 显然Weather不需要Security属性,所以我想我会有一个没有安全性的Core.Job类,然后在Holidays.Job中扩展Core.Job。

但是一旦我这样做,在Core.File类中,它指的是什么Job?因为它位于Core项目中,所以它必须是Core.Job。 那么我是否需要将Job和File放在Holidays中,Weather(以及任何其他未来的项目)使用Core.Job和Core.File?

我不希望Core项目对子项目有任何引用。

我正在使用NHibernate,因此有映射文件 - 增加了复杂性。

希望这很清楚

由于

2 个答案:

答案 0 :(得分:2)

你当然可以这样做,但我不确定它是否会给你带来真正的好处:

  • Core本身是否以任何方式与基础Job一起使用?如果没有,在每个项目中单独实施Job可能会帮助您保持松耦合,即使我有点多余。在我写的代码中,我有时通过提取接口而不添加真正的好处来引入不必要的依赖。这就是我有点谨慎的原因。
  • 如果Core确实使用它,那么重构为公共基础Job的部分可能就是它所使用的界面。
  • 您可能会想到一个接口而不是基类。 Security可能在语义上属于另一个接口。此外,您将对类的控制权移交给Core
  • 您是否曾将一个项目从一个项目交给另一个项目(或者它们是否通过NHibernate映射到同一个DB表?)?如果不这样做,内部冗余类也可以。

答案 1 :(得分:1)

不清楚为什么会混淆你提供的解决方案(假设我理解你)

//Core DLL 

public class Job
{
    public virtual string CreatedBy { get; set; }
    public virtual DateTime? CreatedDate { get; set; }  
    protected IList<File> _files = new List<File>();
    public virtual IEnumerable<File> Files
    {
        get { return _files; }
    }
}

Hollidays

public class HollidayJob : Job
{
    public virtual Security Security { get; set; }
}
天气中的

只需使用类型Job,如果它自给自足的话。

在这种情况下,请参考CoreDLL项目HollidayWeather。当您通过NHibernate对其进行序列化时,HollidayJob会更多地保存一个字段,但当Weather读取同一个表时,它会跳过该字段,因为什么都不知道,实际上并不知道关心它。

希望这有帮助。