Boh, mi sembra confuso
Cmq una cosa che potresti fare molto semplice è mettere dentro a prodotto un bel bool "finalized" e un bel metodo void finalize();
così finalize è pubblico, ma quando viene chiamato "blocca" le modifiche a Prodotto.
Altrimenti puoi sempre usare la convenzione _metodo() affiancata da un bel commento che invita a non usarlo sul metodo che vuoi rendere interno...
ricorda che protected è pur sempre una convenzione, non è strettamente *necessario*.
Nella quasi totalità delle librerie OOP è facile trovare metodi pubblici cosiddetti "internal" che servono proprio a questo scopo...