Olhando o projeto, ele tem um código bem construído, mas acho ele pouco funcional, ou pelo menos não segue o que eu esperaria de um Roteador ou do DHCP. Essas classes estão mais servindo como banco de dados que como unidades lógicas de um programa.
Por exemplo, no caso so DHCP, parece que é o cliente que tem que pesquisar quais IPs estão disponíveis, remover um IP, perguntar sem tem espaço o suficiente. Eu acho que um DHCP deveria funcionar só com o gerarIP, que dá um IP para o cliente, ou nada quando não couber mais clientes. Depois de um tempo se o cliente não pedir para renovar a assinatura dele desse IP, o servidor remove esse IP da lista dos alocados automaticamente. Outra lógica é quando o cliente pedir para gerar um IP, que o DHCP cheque na lista interna se existe um cadastro desse MAC que foi mandado para ele, e dê o IP associado à esse MAC.
E terceiro, se quiser demonstrar herança e interfaces, crie um IPAltaPrioridade e IPBaixaPrioridade, onde ambos implementem a interface de IP.
Quando o IPAltaPrioridade for passado para o Roteador, ele tem prioridade na fila de mensagens. Alias dentro do Roteador você pode implementar ele como um aparelho que mande e receba mensagens, com uma fila interna com prioridades. Ele tb pode ter um um método conectar(porta, EquipamentoDeRede, onde Roteador implementa EquipamentoDeRede), e internamente uma lista de rotas, onde fala que mensagens para a rota X(rota é uma subrede de IP) vão para a a porta 14, e disso um roteador manda a mensagem para outro.
Espero que você já tenha algum conhecimento de redes para saber o que são rotas, e o que DHCP e Roteadores fazem na vida real, para fazer um mock disso.
T+