oop中的开/关原则

本文关键字:原则 oop | 更新日期: 2023-09-27 18:06:37

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

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类。我相信我会达到Open/Close原则。

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

问题:这里,我正在修改一个类。不过,我是否遵循OCP?或者,是否有任何方法在MainServiceClass.cs中添加新方法?

请建议。

注:我需要在所有派生类中实现此方法,即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。这是一种好的做法吗?或者我还有其他的方法吗?

oop中的开/关原则

创建Video_Service不是问题,但更改BaseServiceClass是,您将不会遵循原则。

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

如果你的客户端类需要使用第三种方法,它会更好,如果你做另一个抽象类(只是例如BaseServiceClass2),将从BaseServiceClass继承,并在那里添加新的方法,使你的客户端依赖于这个类。从那里扩展你现有的类WebServiceClass, 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();
        }
    }

如果你让BaseServiceClass成为一个接口,如果你需要添加任何新的东西,你只需创建一个从它继承的新接口,就像在前面的例子中一样,让你的客户端类依赖于你的新接口,从那里你可以创建一个继承WebServiceClass, VoiceSericeClass等的新类,并实现新的接口。

的例子:

    public interface IBaseServiceClass
    {
        IEnumerable<string> GetServiceData();
        IEnumerable<string> GetDashBoardData();
    }
    public interface IBaseServiceClass2 : IBaseServiceClass
    {
        IEnumerable<string> GetNewTypeOfData();
    }

    public class WebServiceClass2 : WebServiceClass, IBaseServiceClass2
    {
        public IEnumerable<string> GetNewTypeOfData()
        {
            return Enumerable.Empty<string>();
        }
    }
    public class WebServiceClass : IBaseServiceClass
    {
        public IEnumerable<string> GetServiceData()
        {
            List<string> MyList = new List<string>();
            return MyList;
        }
        public IEnumerable<string> GetDashBoardData()
        {
            List<string> MyList = new List<string>();
            return MyList;
        }
    }

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