|
Stephen Hewitt wrote: I don't agree that it’s necessarily bad design. It’s perfectly reasonable for a derived class to add functionality rather than replace it.
I guess what bothers me is the ambiguity involved. As a matter of practice should an overriden method call the base class method? If so, should it call it at the beginning of the overriden method or at the end? Should we rely on documentation to specify if calling the base class method is necessary?
|
|
|
|
|
That's where, in a perfect world, documentation would come into the picture. It might be valid to do things both before and after. One pattern you may be interesting in is the following:
NOTE: This is in C++. I'm no C# expert so I'm not sure how much of this will cleanly translate.
class CMyClass
{
public:
bool DoSomething()
{
int size = DoSomething_GetSize();
std::string str = DoSomething_GetString();
}
private:
virtual int DoSomething_GetSize()
{
return 1;
}
virtual std::string DoSomething_GetString()
{
return std::string("Hello");
}
};
In this pattern all the methods that users call are implemented by non-virtual public functions. Any customization needed is implemented by virtual function “hooks” that customize specific aspects of the public functions. In this pattern you don’t call the base class version (you can't as they're private) and customization is limited to specific preplanned areas.
Steve
|
|
|
|
|
What's inelegant about public and private members (no to mention protected )? Data hiding is a fundamental concept in computer programming and public , private and protected are just C++’s (and some other language's) expression of this concept. “Hooks” is my terminology; there is nothing inelegant: if you want a particular aspect of a function to be customised by a derived class you factor it into a virtual function which can then be overridden. This pattern is used in C++'s iostream library. “Crap” you say? If I wanted to find crap I’d visit here[^].
Steve
|
|
|
|
|
|
I don't want to get into a pointless flame war, but still I can't resist one last comment on the following:
The Grand Negus wrote: Technobabble. I think you guys like this stuff to be obscure.
It seems to me you like to "buck the system", so to speak. You're frequently rubbishing existing best practice. Most fields have their own jargon: the people involved generally consider this a simplifying factor rather than the opposite.
Steve
|
|
|
|
|
The Grand Negus wrote: Is "anterior" better than "front"? Is "podiatrist" clearer than "foot doctor"? Is "bi-directional communication link" an improvement over "two-way radio"?
Must you apply layman's terms to everything in everyones chosen career fields?? For the layman, yes, one is better than the other. For the people working in those chosen fields, no, they're not. The layman's terms are more ambiguous.
Just because you think everything is wrong with the world doesn't make it so for the rest of us.
The Grand Negus wrote: My 2006 Chevy has almost twice as many parts as my 1964 Cadillac but is not significantly better in any way.
I'm willing to bet, even with more complexity and parts, statistically, it's more reliable and safer. So, depending on your definition of "better", yes and no, it is "significantly better in any way".
|
|
|
|
|
For you maybe, but most of this is subjective. And you are finding that many of us actually enjoy it.
So, why insist on pissing on our parade? Oh right, you're not talking with us really you're attempting to reach the silent ones. Sorry, I forgot you have you're own agenda.
How does it help someone who is seeking help with his CURRENT design issue with a language that he HAS to use at his JOB by telling him OOP is POOP and English is the way!??? How does that help this person, who's thread you are hijacking with PE pushing?
This statement was never false.
|
|
|
|
|
Stephen Hewitt wrote: This is in C++. I'm no C# expert so I'm not sure how much of this will cleanly translate.
It's the same in C#
Also the non-virtual method usualy does all the parameter checking etc, so you don't need to duplicate it in derived classes.
"Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus
"Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe
|
|
|
|
|
Stephen Hewitt wrote: One pattern you may be interesting in is the following:
This looks like the Template[^] design pattern. I'm glad you brought this up as I think it's a superior way of approaching the problem I described. Thanks.
(My C++ is rusty, but I think the virtual methods should have protected access rather than private, no?)
|
|
|
|
|
If you don't want the derived class to be able to call the base class implementation private is best as any attempt to call it will result in a compiler error. private doesn’t mean you can’t override the method in a derived class, you just can’t call the method in the base class from the derived class. Again, this is in C++, but I think it will be the same in C#.
Steve
|
|
|
|
|
So what? He still has to do his work. You aren't offering anything viable here for someone with a job to do.
This statement was never false.
|
|
|
|
|
A good example of this is in MFC where you can override some of the message functions, but might still call the base to get its bits. But again, I'd say this would be better for optional cases.
This statement was never false.
|
|
|
|
|
Just a thought,
If you override a virtual function in class inherited from a standard control, does that not by default inclde a call to the base function??
|
|
|
|
|
Yea, sorry, slip of the post there
|
|
|
|
|
pprice wrote: If you override a virtual function in class inherited from a standard control, does that not by default inclde a call to the base function??
It depends. If you write the code by hand, it's entirely up to you to add the code that calls the base class method. If you rely on intellisense, it creates the overriden method that includes a call to the base class method.
|
|
|
|
|
That is pretty much what I mean, intelisense does the job of calling the base for you, which to me says that it is a Microsoft approved approach. So it cant be all bad!
|
|
|
|
|
He is asking for help with his work. He doesn't have the choice of foregoing object oriented design. C# is all objects. At least have some sense of the reality of the situation. Sheeesh.
This isn't english. Its C#.
This statement was never false.
|
|
|
|
|
I'll concede this point.
This statement was never false.
|
|
|
|
|
I think its perfectly reasonable, but would caution against this design if its mandatory. It should be elective to call a base's virtual member that you've overridden. Personally if you have a dependency, I'd wrap that in a private member function that calls the virtual one. This way you control through the base class what gets called.
public class BaseClass
{
private void DoMyThing()
{
DoSomething();
}
public virtual void DoSomething()
{
}
}
public class DerivedClass : BaseClass
{
public override void DoSomething()
{
}
}
This statement was never false.
|
|
|
|
|
oops - did not see all messages before writing my comment (page break)
but anyway:
It's perfectly reasonably to do it or not to do it. Depends on what you want to do: replace or add functionality.
And that's the problem with deriving classes: the "internal interface" is very weak. This could leaad to wrong use of your base class, i.e. your base class requires the base.DoSomething but the programmer of the derived class forgets it
Therefore some people do advise to use aggregation in difficult situations.
Happy programming
Urs
-- modified at 5:39 Monday 25th June, 2007
-^-^-^-^-^-
no risk no funk
|
|
|
|
|
Hi all,
I have been pondering over possible solutions for replacement of a legacy application with .NET (2.0)
The current app handles message transmision and format conversion for the finacial industry and the part of the design that I struggle with is as follows
An incomming message (pure Text over IP or X25) will have a series of fields to hold counterparty, amounts deal dates etc and will be formatted something like this
52A: Counterparty : Bank code
36R: Payment : 300000000USD
40: Deal Date : 070101
The field numbers etc are not correct, it serves purely as an example
The system would then be required to forward this recieved message on to one or more different systems with in the organisation, each of which may require the data to be in a different format and require differing transport methods, For example, delivery to a table in a database or simply a text file across the network
Here is the main question, if these systems require different formats (or field names within a database table), I would like to devise a method of field mapping so each output format would not require any hard coding.
Is anybody able to provide suggestions for suitable technology to achieve this mapping?
Many thanks
Paul
please please ignore bad spelling (I do as you can most likely tell)
|
|
|
|
|
I would look at BizTalk for this if I were you. It sounds like an ideal problem for BizTalk.
Deja View - the feeling that you've seen this post before.
|
|
|
|
|
i have to reverse engineer a project done in VC++ 6.0. Its a fairly big project which has almost 4 lakh lines of code.Please advice me the best strategy on how to proceed with this task. Should i use any tools for this. If so which is the best tool?Thanks in advance.
jithesh
|
|
|
|
|
|
Hi,
I'm working on a application which handles media content.
I define a programming of media content which will be played by the application.
I also have an application which is responsible for making that programming.
I want to implement a way of putting the new programming in the player which can be other machine on a network.
Is there any API around which can spare me of writing a protocol? I'm talking about syncing files and other stuff.
Thx,
Best regards,
Nuno
|
|
|
|