OOPS中的开/关原则

时间:2016-09-10 05:33:55

标签: c# asp.net oop solid-principles design-principles

我正在从事电信项目。我在我的项目中实现了开放/封闭原则。以下是我的课程。

MainServiceClass.CS

public abstract class BaseServiceClass
{
    public abstract IEnumerable<string> GetServiceData();
    public abstract IEnumerable<string> GetDashBoardData();
}

Web_Service.CS

public class WebServiceClass : BaseServiceClass
{
    public override IEnumerable<string> GetServiceData()
    {
        List<string> MyList = new List<string>();
        return MyList;
    }

    public override IEnumerable<string> GetDashBoardData()
    {
        List<string> MyList = new List<string>();
        return MyList;
    }
}

Voice_Service.CS

public class VoiceSericeClass : BaseServiceClass
{
    public override IEnumerable<string> GetServiceData()
    {
        List<string> MyList = new List<string>();
        return MyList;
    }

    public override IEnumerable<string> GetDashBoardData()
    {
        List<string> MyList = new List<string>();
        return MyList;
    }
}

将来,如果我需要实现视频服务,我将创建一个新的Video_Service类。我相信我将实现开/关原则。

如果我需要在MainServiceClass.cs中添加新方法,我将添加一个新方法( GetNewTypeOfData())。

问题:在这里,我正在修改一个班级。我还在关注OCP吗?或者,有没有办法在MainServiceClass.cs中添加新方法?

请建议。

P.S。我需要在所有派生类中实现此方法,即Web_Service.cs,Voice_Service.cs和Video_Service.cs

  

在CrudaLilium回复后更新我的问题。

这是我的理解。如果我错了,请纠正我。

我当前的代码:

 public interface IMainBase
{
    IEnumerable<string> GetData2016();
}

public class VoiceService : IMainBase
{
    public IEnumerable<string> GetData2016()
    {
        return Enumerable.Empty<string>();
    }
}

我会在2017年获得新的要求。因此,我将在2017年更新我的代码

public interface IMainBase
{
    IEnumerable<string> GetData2016();
}    

public class VoiceService : IMainBase
{
    public IEnumerable<string> GetData2016()
    { 
        return Enumerable.Empty<string>();
    }
}

//New Code will be Added in 2017....Start

public interface IMainBase2017 : IMainBase
{
    IEnumerable<string> GetData2017();
}

public class voiceService2017 : VoiceService, IMainBase2017
{
    public IEnumerable<string> GetData2017()
    {
        return Enumerable.Empty<string>();
    }
}

//New Code Added be in 2017...Ended

我将在2018年再次获得新的要求。因此,我将在2018年更新我的代码。

 public interface IMainBase
{
    IEnumerable<string> GetData2016();
}    

public class VoiceService : IMainBase
{
    public IEnumerable<string> GetData2016()
    { 
        return Enumerable.Empty<string>();
    }
}

//New Code will be Added in 2017....Start

public interface IMainBase2017 : IMainBase
{
    IEnumerable<string> GetData2017();
}

public class voiceService2017 : VoiceService, IMainBase2017
{
    public IEnumerable<string> GetData2017()
    {
        return Enumerable.Empty<string>();
    }
}

//New Code Added be in 2017...Ended

//New Code will be Added in 2018...Start

public class WebService2018 : IMainBase2017
{
    public IEnumerable<string> GetData2016()
    {
        return Enumerable.Empty<string>();
    }

    public IEnumerable<string> GetData2017()
    {
        return Enumerable.Empty<string>();
    }
}


//New Code will be Added in 2018...End

按照上面的代码,我没有违反OCP。这是一个很好的做法,还是我还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

创建Video_Service不是问题,但改变BaseServiceClass是你不会遵循原则的。

如果你把它抽象化,你需要修改从BaseServiceClass继承的所有其他类。但是,即使你没有将它抽象化,它似乎也毫无意义,因为使用你的BaseServiceClass的所有当前客户端类都不使用除了你已经拥有的2之外的任何其他方法。

如果你的客户端类需要使用第三种方法,那么如果你创建另一个将从BaseServiceClass2继承的抽象类并在那里添加新方法并制作它会更好你的客户依赖这个班级。从那里扩展现有的类BaseServiceClassWebServiceClass,您必须创建新类并从VoiceSericeClass继承并使用适配器模式。

示例代码:

BaseServiceClass2

如果你使 public abstract class BaseServiceClass { public abstract IEnumerable<string> GetServiceData(); public abstract IEnumerable<string> GetDashBoardData(); } public abstract class BaseServiceClass2 : BaseServiceClass { public abstract IEnumerable<string> GetNewTypeOfData(); } public class WebServiceClass2 : BaseServiceClass2 { private BaseServiceClass adaptee; WebServiceClass2(BaseServiceClass adaptee) { this.adaptee = adaptee; } public override IEnumerable<string> GetDashBoardData() { return adaptee.GetDashBoardData(); } public override IEnumerable<string> GetNewTypeOfData() { return Enumerable.Empty<string>(); } public override IEnumerable<string> GetServiceData() { return adaptee.GetServiceData(); } } 成为一个接口会更好,如果你需要添加任何新东西,你只需创建一个继承自它的新接口,就像前面的例子一样,让你的客户端类依赖于你的新接口,从那里你可以创建继承自BaseServiceClassWebServiceClass等的新类,并实现新的接口。

示例:

VoiceSericeClass

类/接口名称仅用作占位符,最好以更有意义的方式命名它们。