Need help: about OOP inheritance/abstract class

T

Tee

Hi,

I have a base usercontrol with a method (blank method, no code), I have
another few usercontrols that will inherit this base usercontrol, but I want
to force all the usercontrol that inheriting this base usercontrol to
override the method with its own code. How do I do it?

I have tried to make the base usercontrol an abstract class (mustinherits +
mustoverrides), this works, but all the usercontrols that inherit it will
not able to open in VS designer because of inherting an abstract class.

I have also tried to use interface, this works as well, but I can't force
those usercontrols that inherit base usercontrol MUST have the interface.

Anyone has a solution for this?


Thanks,
Tee
 
E

Elementary Penguin

Tee said:
Hi,

I have a base usercontrol with a method (blank method, no code), I have
another few usercontrols that will inherit this base usercontrol, but I
want to force all the usercontrol that inheriting this base usercontrol to
override the method with its own code. How do I do it?

If you are going to /force/ them to override it ( polymorphism ) why have it
in the first place?

You should define an *interface* with a stub method and force them to
implement it.

I do this in one of my web service applications. There are two interfaces
and a base abstract class. The interface accounts for methods that must
be implemented in the derived classes, but which have no default method in
the abstract class. So each derived class has one abstract class and two
interfaces to inherit from.
 
O

Olorin

I haven't tried, but have you tried to use inheirtance AND interface
together?

i.e.
* base class with stuff that should be inherited as-is
* interface with the definition of the method that the inheriting
classes should implement/override
* inheriting/implementing classes: they inherit from the base class,
AND they implement the interface.

The children should then get all that the base class provides and Be
Forced to implement the method(s) defined in the interface.
HTH,
F.O.R.
 
T

Tee

I have tried it.
The children should then get all that the base class provides and Be
Forced to implement the method(s) defined in the interface.
HTH,
F.O.R.

The base class that implements the interface will automatically has the
method in the class (just an empty method, no code).
And yes, the children get all the base class provided, and they inherit the
empty method as well ... the problem is it won't force the children to
overrides it.


Thanks.
 
B

Bruce Wood

This is not just a problem with user controls; it is also a problem
with inheriting Forms.

You cannot use an abstract base class for the reasons you mentioned.
There is no way around it at present.

The best you can do is write the methods in the base class to throw a
NotImplementedException. Then if the child class does not override them
it will blow up at run time. There is no way to enforce the override
via a compile-time check.
 
D

Dennis Myrén

Why not just(shortened):

abstract class Abstract
{
public abstract void MustOverrideThisAbstractMethod ( ) ;
}

class Concrete : Abstract
{
override public void MustOverrideThisAbstractMethod ( )
{
//Implement something here.
}

}

Declaring a method as abstract within an abstract class means the base class
will demand an implementation of that method from the concrete derived
class.
 
T

Tee

Hi Dennis,

See my previous post:
I have tried to make the base usercontrol an abstract class (mustinherits +
mustoverrides), this works, but all the usercontrols that inherit it will
not able to open in VS designer because of inherting an abstract class.

This just won't work on forms or usercontrols ... it won't effect runtime,
but it's trouble enough if you can't open it in VS Designer.


Thanks,
Tee
 
D

Dennis Myrén

Sorry, i should probably read the posts fully before replying them.

I had a bunch of webforms once which all needed common extra features in
order
to provide the functionality of a step in a wizard.
There was no way i could force those webforms to implement my custom
interface
in addition to inherit System.Web.UI.Page.
But i myself though, knew which ones of them should provide that
functionality,
and had them implement that interface.
class WizardStep1 : System.Web.UI.Page, IWizardStep
 
N

Nick Hall

Bruce Wood said:
This is not just a problem with user controls; it is also a problem
with inheriting Forms.

You cannot use an abstract base class for the reasons you mentioned.
There is no way around it at present.

The best you can do is write the methods in the base class to throw a
NotImplementedException. Then if the child class does not override them
it will blow up at run time. There is no way to enforce the override
via a compile-time check.
Well there is one workaround which I've used. You can use use compile time
constants to declare your class such that the MustInherit attribute is only
enforced in Release builds e.g.

#If Debug then
Public MyClass
#Else
Public MustInherit MyClass
#End if
....

Any methods that should be overridden can be given a default implementation
in the debug build (to write a message to the console or throw an exception)
e.g.

....
#If Debug then
Public Sub MethodThatMustBeOverriden()
Debug.Fail("Method not overridden")
End Sub
#Else
Public MustOverride Sub MethodThatMustBeOverriden()
#End if

This has worked OK for me in the past.

Hope this helps,

Nick Hall
 
O

Olorin

The children should then get all that the base class provides and
Be
The base class that implements the interface will automatically has the
method in the class (just an empty method, no code).
And yes, the children get all the base class provided, and they inherit the
empty method as well ... the problem is it won't force the children to
overrides it.

I didn't say that the base class should implement the interface ;-)
ANd, yes I now realize that the solution I proposed would have the draw
back of the
base class not implementing the method(s) in your interface. SO it
might or might not work for you.

HTH,
F.O.R.
 
T

Tee

Very great idea, thanks!


Nick Hall said:
Well there is one workaround which I've used. You can use use compile time
constants to declare your class such that the MustInherit attribute is only
enforced in Release builds e.g.

#If Debug then
Public MyClass
#Else
Public MustInherit MyClass
#End if
...

Any methods that should be overridden can be given a default implementation
in the debug build (to write a message to the console or throw an exception)
e.g.

...
#If Debug then
Public Sub MethodThatMustBeOverriden()
Debug.Fail("Method not overridden")
End Sub
#Else
Public MustOverride Sub MethodThatMustBeOverriden()
#End if

This has worked OK for me in the past.

Hope this helps,

Nick Hall
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top