Is having an empty base class bad design?
Asked Answered
M

4

7

I need a base class for my DTO classes which will be used in my generic interfaces.

But the DTO classes have nothing in common. They are just dumb classes containing some properties.

public void GetGridData()
{

   IDataForGrid<DTOBase> aa;

   if(request == 1) aa = new CustomerGridData;
   if(request == 2) aa = new OrderGridData;

   var coll = aa.GetList();
}

public class CustomerGridData : IDataForGrid<CustomerDTO>
{
  ...
}
Martineau answered 11/3, 2010 at 10:51 Comment(10)
Object is an empty base class :)Hilliard
@Brian - Object isn't empty :)Gocart
this is related to https://mcmap.net/q/1476487/-generic-interface-problem for backgroundGocart
@Mike: Well, if you want to split hairs. It doesn't have any data of its own.Hilliard
@Brian - I wasn't trying to split hairs, but I'm not sure if I would agree that empty means no data. Because then a class with no data and no methods is even more emptier.Gocart
@Mike: Okay, fair enough. In that case there is no such thing as an empty base class in C#. I know that Object has methods and instances do in fact take up space on the heap even tough they have no retrievable state, so you're right Object isn't empty in that sense, but from a modelling perspective I would consider it empty.Hilliard
@Brian - So now I think I might be splitting split hairs. Not trying to start an argument, I think we're at the immaterial difference level. Interestingly enough I was not approaching it from a memory usage perspective but a modelling perspective. If I inherit from Object do I get any fields, methods or properties? I do so from my view it isn't empty. However in the case of Object I would never draw it in a UML diagram or anything. So to me Object is empty for some value of empty.Gocart
@Mike: Let me retract the hair splitting comment then. I wasn't trying to start an argument either. In fact, I think we do agree. As you say Object is empty for some value of empty, and that what was I was referring to in my initial comment. If Object isn't empty, then no base class can be empty in C#.Hilliard
Object does have data! It has a reference to a Type (vtable) and a Monitor.Hominy
EventArgs is an empty base class.Effloresce
T
7

If they have nothing in common, what are you going to do with the instances you retrieve from your list?

In any case, having the base class means that when (okay, if) you identify something they do need to have in common later on, you don't have to go back and refactor (re-base) everything. But I'd consider using an interface rather than a base class for this sort of thing in any case, as it doesn't sound like there's a strong need to reuse underlying implementation (as they have nothing in common yet!). It'll depend on what you think they may end up having in common later on.

Thecla answered 11/3, 2010 at 10:54 Comment(0)
B
7

It is not a bad design, although somewhat uncommon. Think of it this way - there are at least two benefits while there are no drawbacks:

  • The base class serves as a filter for your interfaces so that you can't pass just any object to them - just your DTO objects. Marker interfaces could to this too.
  • When they eventually do get something in common, it will be easy to add it there and you won't have to refactor everything.
Birnbaum answered 11/3, 2010 at 10:57 Comment(0)
P
4

The .NET coding guidelines say that having an empty base class or interface (also called “tag” interface) is indeed bad style. The preferred style is to use an attribute instead to annotate classes of the same kind. There is also an FxCop rule to enforce this convention.

However, I sometimes (in rare cases) use this idiom when a common base class is useful to denote a common hierarchy even if no common functionality exists. Attributes cannot be used for this.

For example, in an interpreter for a programming language several methods return a special base class Value, i.e. something which has a value inside that programming language. Basically, this value can be everything from a number to a string (which, are special classes, not System.Int32 or System.String) to a composite object. I could also return System.Object but this would make the typing of my public interface weaker.

Good, self-documenting code profits from the restricted interface.

Professorate answered 11/3, 2010 at 10:58 Comment(3)
A marker interface/class can server as a compile-time constraint so that you can't pass the wrong object to a method. Attributes can't do this. So I'm inclined to disagree with the guideline.Birnbaum
Was just about to post this link! msdn.microsoft.com/en-us/library/ms182128%28VS.80%29.aspxParadrop
@Vilx: as am I (see the example I added). But it is an FxCop guideline.Professorate
G
1

In java this is called a Tag Interface. The link provides some good background on tag interfaces, their uses and issues.

Gocart answered 11/3, 2010 at 11:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.