Deprecation in Salesforce managed packages is very dangerous and doesn't work in the way you might expect. Deprecating a global (class/interface/method/enum etc.) does two things:
- As mentioned in an earlier answer, it prevents use of the component in new orgs whilst allowing it to continue to be used in existing orgs when upgraded to or through the package version that deprecated the component
- It locks that component so you can no longer maintain it.
It should also be noted that you cannot delete a global and that still applies in this case; you cannot delete deprecated global components. Even in major version releases from what I can see.
Normally (outside the Salesforce realm) when you deprecate something it can still be used and provides the original behaviour for a period of time before it is deleted by the developers (usually on the first major version release following the minor release that deprecated the component). However, because Salesforce's deprecation mechanism locks the component, preventing it from being modified, and does not allow deletion of the component, you cannot afford to take this approach.
If you really want to deprecate your global component, the first thing you must do is empty its implementation. Clearly this prevents the component from retaining the existing behaviour and therefore immediately "breaks" any subscriber org implementation that uses it still. If you don't empty the implementation, since you cannot modify the deprecated component, once published in a new package version, you can never remove or change signatures of any other components (e.g. other classes/methods) in your package that the deprecated component uses.
Another side-effect of this locking of the deprecated component's implementation is that you cannot maintain the component from release to release or even in a patch; a bug found in a deprecated component simply cannot be corrected if it exists in that component's implementation (rather than in other components used by the deprecated component).
Deprecation is a managed package hell. Don't do it. Salesforce urgently needs to fix deprecation so it works in a way compatible with any other software development environment and release process. I raised an idea, https://success.salesforce.com/ideaView?id=0873A000000lIJXQA2, to help address this but being an ISV-related issue I don't ever expect it to get implemented since it is too niche and won't get the required votes to be considered.
abstract
class, the procedure would be fundamentally different, right? – coldspeed Feb 13 '17 at 11:46