OCP'yi daha genel, DIP'i ise OCP'yi tamamlayan bir prensip gibi düşünmeliymişiz. Birbirlerine oldukça yakın sayıldıkları için sadece birini violate eden bir örnek bulmak zor. Şu örnek güzel,
What is difference between the Open/Closed Principle and the Dependency Inversion Principle?
daha iyi anlamak için oradaki örneği klasik örnekler gibi gözümüzde canlandırabileceğimiz şekilde düşünebilirsin.
abstract sınıf -> çalışanlar abstract sınıfı olsun, dependency1 ve dependency2 de şirketin her çalışana verdiği şirkettelefonu ve şirketaracı olsun.
Bu abstract sınıfı extend eden standart çalışan, kıdemli çalışan vb. sınıflar olabilir. Mesela sisteme yönetici diye bir çalışan tipi eklemek istediğimde diğer kodları değiştirmeme gerek kalmadan abstract sınıfı extend eden yönetici diye bir sınıf ekleyebilirim (mesela yönetici sınıfına şirketuçağı, uydu telefonu vb. tanımlayabilirim). Open-closed a uyumlu görünüyor.
Ancak bu adamın örneğini düşünürsen bu DIP'e ters bir durum, telefondur, taşıttır o cins alt seviye sınıflara bağımlı durumda. DIP'e uyumlu olması için nasıl bir değişiklik yapılabilir: çalışanın vasıtasına bakıp da tamam sen arabayla git, sen uçakla git vb. kullanılması yerine seyahatEt() iletisimKur() gibi interface implementasyonları olmalı, calisan.iletisimKur() şeklinde method çağırılmalı.