member hiding question
-
I'm trying to make a visually reversed trackbar. For example, pretend the trackbar's value is 100 (out of 300). The public member "rValue" would tell you that the value is actually 200 (meaning
Maximum - (Value - Minimum)
). And, if the user set "rMaximum" to a certain value, it would adjust the Value accordingly (to keep it the same amount below Maximum, not the same amount above Minimum).-Daniel Typing too fast fro my owngood
OK. Well, why not override the Value method instead and have it track in reverse ?
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
-
OK. Well, why not override the Value method instead and have it track in reverse ?
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
Two responses... 1) Value is a method? I thought it was just an int member... I suppose it would be most efficient to make it one of those funky methods that look like members to outsiders, so that whenever it was changed the little tick thing would move... 2) If I try to override it, I can just call
((TrackBar)base).Value
from inside my class, right? I'll give it a shot, thanks!-Daniel Typing too fast fro my owngood
-
Two responses... 1) Value is a method? I thought it was just an int member... I suppose it would be most efficient to make it one of those funky methods that look like members to outsiders, so that whenever it was changed the little tick thing would move... 2) If I try to override it, I can just call
((TrackBar)base).Value
from inside my class, right? I'll give it a shot, thanks!-Daniel Typing too fast fro my owngood
1 - OK, I mixed my terminology. I doubt it's an int. I meant it's a property. 2 - Yes, if you use new and not override, I'd expect you can do that.
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
-
1 - OK, I mixed my terminology. I doubt it's an int. I meant it's a property. 2 - Yes, if you use new and not override, I'd expect you can do that.
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
Well, this is what I tried (code below). However, the compiler says "
Use of keyword 'base' is not valid in this context
". I thought thatbase
was likethis
, but for accessing a parent class. How should I do it?public class ReverseTrackBar : TrackBar
{
private new int Value
{
get { return (((TrackBar)base).Maximum - (((TrackBar)base).Value - this.Minimum)); }
set { ((TrackBar)base).Value = (((TrackBar)base).Maximum - ((int)value - this.Minimum)); }
}
private new int Maximum
{
get { return ((TrackBar)base).Maximum; }
set
{
int val = this.Value;
((TrackBar)base).Maximum = (int)value;
this.Value = val;
}
}
public ReverseTrackBar()
{
this.Value = 0;
}
}-Daniel Typing too fast fro my owngood
-
Well, this is what I tried (code below). However, the compiler says "
Use of keyword 'base' is not valid in this context
". I thought thatbase
was likethis
, but for accessing a parent class. How should I do it?public class ReverseTrackBar : TrackBar
{
private new int Value
{
get { return (((TrackBar)base).Maximum - (((TrackBar)base).Value - this.Minimum)); }
set { ((TrackBar)base).Value = (((TrackBar)base).Maximum - ((int)value - this.Minimum)); }
}
private new int Maximum
{
get { return ((TrackBar)base).Maximum; }
set
{
int val = this.Value;
((TrackBar)base).Maximum = (int)value;
this.Value = val;
}
}
public ReverseTrackBar()
{
this.Value = 0;
}
}-Daniel Typing too fast fro my owngood
I guess the 'new' keyword is hiding the base value.
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
-
Well, this is what I tried (code below). However, the compiler says "
Use of keyword 'base' is not valid in this context
". I thought thatbase
was likethis
, but for accessing a parent class. How should I do it?public class ReverseTrackBar : TrackBar
{
private new int Value
{
get { return (((TrackBar)base).Maximum - (((TrackBar)base).Value - this.Minimum)); }
set { ((TrackBar)base).Value = (((TrackBar)base).Maximum - ((int)value - this.Minimum)); }
}
private new int Maximum
{
get { return ((TrackBar)base).Maximum; }
set
{
int val = this.Value;
((TrackBar)base).Maximum = (int)value;
this.Value = val;
}
}
public ReverseTrackBar()
{
this.Value = 0;
}
}-Daniel Typing too fast fro my owngood
-
I guess the 'new' keyword is hiding the base value.
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
-
Oh, I guess you don't have to cast
base
to a type because the type is already known (the type I'm inheriting from).-Daniel Typing too fast fro my owngood
Yes, I wondered about that :-)
Christian Graus - Microsoft MVP - C++ Metal Musings - Rex and my new metal blog
-
Well, this is what I tried (code below). However, the compiler says "
Use of keyword 'base' is not valid in this context
". I thought thatbase
was likethis
, but for accessing a parent class. How should I do it?public class ReverseTrackBar : TrackBar
{
private new int Value
{
get { return (((TrackBar)base).Maximum - (((TrackBar)base).Value - this.Minimum)); }
set { ((TrackBar)base).Value = (((TrackBar)base).Maximum - ((int)value - this.Minimum)); }
}
private new int Maximum
{
get { return ((TrackBar)base).Maximum; }
set
{
int val = this.Value;
((TrackBar)base).Maximum = (int)value;
this.Value = val;
}
}
public ReverseTrackBar()
{
this.Value = 0;
}
}-Daniel Typing too fast fro my owngood
Heritos Gger wrote:
However, the compiler says "Use of keyword 'base' is not valid in this context".
The error is not related to the use of the keyword 'base', but to the fact that you try to cast the base to type TrackBar. You don't need to do that. Remove all of these casts (e.g. ((TrackBar)base).Value should be base.Value) and the compiler error will disappear.
-
Well, this is what I tried (code below). However, the compiler says "
Use of keyword 'base' is not valid in this context
". I thought thatbase
was likethis
, but for accessing a parent class. How should I do it?public class ReverseTrackBar : TrackBar
{
private new int Value
{
get { return (((TrackBar)base).Maximum - (((TrackBar)base).Value - this.Minimum)); }
set { ((TrackBar)base).Value = (((TrackBar)base).Maximum - ((int)value - this.Minimum)); }
}
private new int Maximum
{
get { return ((TrackBar)base).Maximum; }
set
{
int val = this.Value;
((TrackBar)base).Maximum = (int)value;
this.Value = val;
}
}
public ReverseTrackBar()
{
this.Value = 0;
}
}-Daniel Typing too fast fro my owngood
I think the solution to your problem is this: Hide the property of the base class, but make the access modifier the same as in the base class, i.e. public. Next, add the modifier protected to the set-accessor (.NET 2.0 required). The get-accessor cannot be protected as well, but I don't think that's a problem, I fact I think it's good practice to keep the get-accessor accessable. You'll get something like this:
public new int Value { get { return (base.Maximum - (base.Value - this.Minimum)); } protected set { base.Value = base.Maximum - (value - this.Minimum); } }
That should work. -
Heritos Gger wrote:
However, the compiler says "Use of keyword 'base' is not valid in this context".
The error is not related to the use of the keyword 'base', but to the fact that you try to cast the base to type TrackBar. You don't need to do that. Remove all of these casts (e.g. ((TrackBar)base).Value should be base.Value) and the compiler error will disappear.
-
I think the solution to your problem is this: Hide the property of the base class, but make the access modifier the same as in the base class, i.e. public. Next, add the modifier protected to the set-accessor (.NET 2.0 required). The get-accessor cannot be protected as well, but I don't think that's a problem, I fact I think it's good practice to keep the get-accessor accessable. You'll get something like this:
public new int Value { get { return (base.Maximum - (base.Value - this.Minimum)); } protected set { base.Value = base.Maximum - (value - this.Minimum); } }
That should work.Yes, that's close to what I ended up with. The set accessor is fine to be public because I can perform the reversal of data right there. I just didn't want the "outside" to have access to the base class's Value and Maximum properties. All I needed to do was overload them with
new
, and now it works beautifully. Thank you, everyone! Case closed.-Daniel Typing too fast fro my owngood