Interface, Classe Abstrata ou outro?

Bom dia galera Tenho uma 3 classes, idênticas ex: program1, program2 e program3 que usam o mesmo algoritmo para gerar um serial ex: Nome + (Versao * 2), estou tentando implementar com interface mas não esta muito certo

class program1 : Programa {
     string nome;
     string versao;

     program1(string nome, string versao){
         this.nome = nome;
         this.nome = nome;
     } 
     //métodos get ocultos
    public string gerarSerialPara(this){
         return GeradorDeSerial.gerar(this);
    }
} 

A interface esta assim:

interface Programa{
     string gerarSerialPara();
}

e a Classe Gerador:

class GeradorDeSerial(){

    public string GeradorDeSerialPara(Programa programa){
        return programa.Nome + (programa.Versao * 2);
   }

}

A interface programa não tem acesso aos métodos da classe programa1,
Estou fazendo certo ou seria melhor usar uma classe abstrata?

Alguém tem algum modo melhor de fazer aplicando Design Patterns?

Obrigado.