Como projetar software extensível (arquitetura de plugins)? [fechadas]

Preciso de alguns recursos que falem sobre como projetar seu software para ser extensível, ou seja, para que outras pessoas possam escrever complementos / plug-ins que adicionem funcionalidade a ele.

O que você recomenda? Algum livro por aí que discute o assunto?
Eu preferiria algo curto e direto ao ponto; um pouco de teoria e um monte de exemplos concretos.

Não estou direcionando um idioma específico, quero entender a ideia principal para poder implementá-la em qualquer idioma.

E pelo mesmo motivo, prefiro não fazê-lo usando uma estrutura criada por outra pessoa (a menos que a estrutura não seja de nível muito alto, ou seja, não ocultetambém muito), no momento eu só quero me educar sobre o assunto e experimentar várias maneiras de implementá-lo. Além disso, uma estrutura geralmente assume o conhecimento do usuário sobre o assunto.

ATUALIZAR

Não estou perguntando sobre OOP ou permitindo que minhas classes sejam herdadas. Estou falando de projetar um aplicativo que será implantado em um sistema, de modo que possa ser estendido por complementos de terceiros após a implantação.

Por exemplo, o Notepad ++ possui uma arquitetura de plug-in onde você pode colocar um arquivo .dll na pasta de plug-ins e adiciona funcionalidade ao aplicativo que não estava lá, como seleção de cores, inserção de trechos ou muitas outras coisas. (uma ampla variedade de funcionalidades).

questionAnswers(13)

yourAnswerToTheQuestion