オブジェクト指向プログラミング
例えば、共通の親クラスを持たないFileReaderクラスとWebPageScraperクラスに、unicode_to_ascii()というメソッドを持つUnicodeConversionMixinクラスを含ませる(mixinする)ことにより共通のメソッドを提供することができる。
抽象クラスは、オブジェクトへインスタンス化することはできない。インスタンス化できる他の具象クラスが継承するためにのみ存在する。Javaでは、finalキーワードを用いて、クラスがサブクラス化されるのを防止できる。
Composition over inheritanceの方針は、継承の代わりに合成を使って has-a 関係を実装することを提唱している。例えば、EmployeeクラスはPersonクラスを継承する代わりに、各Employeeオブジェクトの内部にPersonオブジェクトを含めることで、仮にPersonクラスが公開された属性やメソッドを多数持っていても、外部のコードからは隠せるようにする。また、Goのように、継承を全くサポートしていない言語も存在する。
開放/閉鎖原則は、クラスやメソッドは「拡張に対しては開放的であるが、変更に対しては閉鎖的であるべき」という原則を提唱している。
委譲もまた、継承の代わりに利用できる言語機能である。
また、OOPツールキットの存在は、イベント駆動型プログラミングの人気を高めることにも繋がった(ただし、この概念はOOPに限定されるものではない)。 チューリッヒ工科大学では、ニクラウス・ヴィルトらが、データ抽象化やモジュール化プログラミング(英語版)などの研究を行っていた (ただし、これらは1960年代以前にも一般的に使われてはいた)。 1978年に発表されたModula-2にはこの2つが盛り込まれており、その後に発表されたOberonでは、オブジェクト指向やクラスなどに対する独自のアプローチが盛り込まれている。
オブジェクト指向の機能は、Ada、BASIC、Fortran、Pascal、COBOLなど、既存の多くの言語に追加されていったが、しかし、設計当初にこれらの機能を想定していなかった言語に追加した場合、コードの互換性や保守性には問題が生じることが多かった。
最近では、主としてオブジェクト指向でありながら、手続き型プログラミングの方法論にも対応した言語が数多く登場している。そのような言語としては、PythonやRubyがある。最近の商業的なオブジェクト指向言語で最も重要なものには、サン・マイクロシステムズ社が開発したJavaや、Microsoftの.NETプラットフォーム用に設計されたC#、Visual Basic .NET (VB.NET) が挙げられる。 これら二つのフレームワークは、実装を抽象化することによるOOP使用の利点をそれぞれの方法で示している。VB.NETとC#間では言語間継承をサポートしており、一方の言語で定義されたクラスが他方の言語で定義されたクラスをサブクラス化することができる。
継承は意味論的には is-a の関係を作るため、サブクラスからインスタンス化されたオブジェクトは、スーパークラスからインスタンス化されたオブジェクトの代わりに、常に安全に使用できる、と推測するのは直感的ではあるが、この直観は、ほとんどのOOPL、特にミュータブルなオブジェクトを許可している言語では誤りである。 (ミュータブルなオブジェクトを持つ)OOPLの型検査器によって強制される部分型付け (部分型多相/サブタイピング多相)では、いかなる状況でも、振る舞いにおける部分型付け (Behavioral subtyping) は保証することはできない。 Behavioral subtyping は一般に決定不能であり、プログラム (コンパイラ)では実装できない。クラスやオブジェクトの階層は、文法間違いでは検出できない使い方がされる可能性を考慮に入れて、慎重に設計する必要がある。この問題はリスコフの置換原則としても知られている。