ak tomu dobre chapem po tych rokoch opakovani, tak:
abstraktna trieda je v prvom rade trieda so vsetkym, co moze trieda obsahovat (aj clenske premenne a aj metody). abstraktna ale znamena, ze nemozes z nej vytvorit instanciu. vyznam pouzitia je teda prave pri dedicnosti, kedy mas spolocneho predka (abstraktnu triedu), ktory zdruzuje spolocne prvky kazdeho potomka (vlani to bolo ukazane na takom fajnom priklade, ze Shapes/Tvary)
rozhranie je len predpisany sposob spravania a kedze spravanie je definovane metodami, tak rozhranie obsahuje len prototypy metod (bez ich tela). trieda, ktora nasledne toto rozhranie implementuje, sa zavazuje, ze bude implementovat vsetky metody, ktore dane rozhranie obsahuje.
a hovorit o tom, ze rozhrania nahradzuju viacnasobnu dedicnost je trosku scestne. sak uvidite sami ten rozdiel. (aj ja som ho videl vlani a vidim ho znova - sak preco si to nezopakovat, ze? :-)