The correct approach is: public class AnotherObject : MyObjectBase { public AnotherObject(IMyRequiredInterface interfaceImpl) : base(interfaceImpl) { } } You specifically asked for an approach other than this approach. Why? The goal is to meet the requirement of the base class without the descendant classes knowing anything about it That's generally the wrong thing to do.
Why do you want to do it? Update: Based on your later comment, you should probably use (and configure your container to use) property injection instead of constructor injection. That will get you all of your requirements.
The correct approach is: public class AnotherObject : MyObjectBase { public AnotherObject(IMyRequiredInterface interfaceImpl) : base(interfaceImpl) { } } You specifically asked for an approach other than this approach. Why? The goal is to meet the requirement of the base class without the descendant classes knowing anything about it.
That's generally the wrong thing to do. Why do you want to do it? Update: Based on your later comment, you should probably use (and configure your container to use) property injection instead of constructor injection.
That will get you all of your requirements.
1 It's not wrong if the subclass can reasonably supply an IMyRequiredInterface object for the superclass that would work for all instances of the subclass.... – Curt Sampson May 25 '09 at 19:16 In many cases, you are correct. In the particular case, however, the context is the exclusion of explicit dependencies from within the services classes, with the use of a container to wire the dependencies together. – Justice May 25 '09 at 19:34 Code smells aside, the best solution for me would have been to use property injection.
I opted to readdress the problem from a different perspective which allowed me to simply have a parameterless ctor in the base class. Thanks to everyone who answered. – mannish May 26 '09 at 6:29.
Err....the whole point of inheriting from MyObjectBase is that, as it were, you get the good and the bad, as far as the behaviour goes. If you can't create a MyObjectBase without an object implementing IMyRequiredInterface, you can't create a subclass without such an object either. So what do you do when someone doesn't hand you that.Do you have a default?
It's quite reasonable for a subclass to instantiate something that implements IMyRequiredInterface, and pass that to the superclass constructor with a super(...) call. Can you do that?(Though, as I recall, you can get a bit hung up on this in Java, having to call super before doing anything else....).
There's a code smell here. If you inherit from a class that has a parameterless constructor it means that the author of this base class intended that it cannot function properly without supplying the necessary dependency. If you inherit from it and call a base method that required this dependency your code will probably fail if the dependency is not supplied.So if you really think that you should completely override this behavior you don't have to inherit from this base class, otherwise just copy the constructor in the inherited class.
Class MyBase { readonly int _x; public MyBase(int x) { _x = x; } protected MyBase() { _x = 0; } } class MyChild : MyBase { public MyChild() { } }.
I would do that: public class AnotherObject:MyObjectBase { public AnotherObject():MyObjectBase(new RequiredInterfaceImplementation()) { } } Where: public class RequiredInterfaceImplementation:IMyRequiredInterface { ... your implementation }.
Most DI frameworks have the functionality to inject services into properties (Property Setter Injection) using Attributes so you can try that. You can subclass but the subclass will have to know how to create or get the Interface Implementation (using the ServiceLocator or something). From the DI's point of view it doesn't have anything to fulfill because the class only has an empty constructor (most use the constructor with the most params) and no attributes telling him to do anything else.
I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.