It is perfectly valid to inject $scope to get access to things like $watch even when your using the "controller as" syntax. For example:
JS
var MyController = function($scope) {
$scope.$watch('ctrl.someVar' function() {
...
});
this.someVar = 123;
}
MyController.$inject = ['$scope'];
HTML
<div ng-controller="MyController as ctrl">
....
</div>
The first example you gave of injecting a service into a controller is good. For the inheritance example I would do something like this.
var BaseController = function(AService, BService) {
this.aService = AService;
this.bService = BService;
}
BaseController.prototype.doSomethingWithAAndB = function() {
...
}
var MyController = function(AService, BService, CService) {
BaseController.call(this, AService, BService);
this.cService = CService;
}
MyController.$inject = ['AService', 'BService', 'CService'];
//Note: you'll need to add a polyfill for Object.create if you want to support ES3.
MyController.prototype = Object.create(BaseController.prototype);
If you find it is too cumbersome to specify all the parameters in the child controller you could always just inject $injector
and pass that up to your base controller.