If your descendant class corrects the generic type, then you need to use this fixed type instead of T. In your case:
protected procedure Notify(const Value: TSomeclass; Action: TCollectionNotification); override;
is the correct way to declare this function.
Error:
Notify ad differs from previous ad
It is an unfortunate case of duplicate Delphi RTL name types in different units.
System.Classes unit defines
TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
and System.Generics.Collections defines
TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);
You almost certainly have Generics.Collections declared before Classes in your uses , and the compiler resolves the unwanted version of TCollectionNotification .
To fix this, either reorganize your uses clauses so that Generics.Collections after Classes or use the full type name, that is:
procedure Notify(const Value: TSomeClass; Action: Generics.Collections.TCollectionNotification); override;
The lesson with the differs from previous declaration error is a methodological check of your types. Ctrl + CLICK in the type identifier will lead you to determine the type used by the compiler.
J ... source share