This may just be me showing my lack of knowledge / bad programming practice, but i’m curious to know if:
a) This already exists
b) If it doesn’t exist, if it’s bad programming practice to do so
But here’s my question:
Suppose I have a class, let’s call it “Computer” and it holds data of all the computers in a company. Now, it just so happens that this company has thousands of Dell computers and thousands of HPs and nothing else. (Again please stick with me here, this is just an example to illustrate my point)
Now, I could define my class as follows:
Public Class Computer
Dim Type as string
Dim SerialNumber as string
Dim User as String
...
End Class
Now, in my code I create two lists:
Dim DellComps as new list(of computer)
Dim HPComps as new list(of computer)
Obviously, for the DellComps, all them will have .Type = "Dell" and for the HPComps, all will have .Type = "HP"
Now, I know I could set this variable in the constructor very easily, but I’m wondering if there is a smarter way to declare the variable inside the class – Similar to the VB Shared / C# Static statement where all the instances of the class share the same variable.
My thoughts are:
- Inherit the class and create a shared variable in the child class
- Just leave it as is and declare the Type var in the constructor
- Maybe this is something that could be done via interfaces somehow
- MOST PROBABLE – something i just don’t know about
Thanks and I hope what I’m asking makes sense!!!
If you are always setting a flag in the constructor indicating the type of computer (which is NOT a typical business object scenario, where the type can be edited), chances are that you can really solve your problem using subclasses.
Subclass Computer to create DellComputer and HpComputer classes.
When creating lists of each type of computer, one approach is to have a master list of all computers and use Linq’s Enumerable.OfType(TResult) to select instances that match the type you are interested in.
If indeed you want the type of class to be editable after the class is created, instead provide a property to modify the type of computer. You may for convenience provide a constructor overload that also sets the property (though I would shy away from that personally). If you do, have that constructor overload use the property to set the type.
UPDATE
Example of what the factory pattern might look like.