[C#] Multiple inheritance / interfaces

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Stray
  • Registratie: Juli 2003
  • Laatst online: 08-09 22:54
Ik wil een eigen set van Form controls maken die zijn afgeleid van de controls van het .NET framework. Maar deze controls hebben allemaal een set van nieuwe functies met dezelfde implementatie. Multiple inheritance kan niet, interfaces hebben geen implementie, dus kan ik enkel de code kopiëren in iedere klasse (en onderhouden).
Is er een manier om hier iets aan te doen?

Acties:
  • 0 Henk 'm!

  • Brainstorm
  • Registratie: November 2000
  • Laatst online: 03-09 21:47
Tsja, simpelste manier is denk ik om de implementatie van functies die hergebruikt worden over de verschillende controls af te splitsen naar een aparte class. Zoiets als dit dus:

Afbeeldingslocatie: http://blog.vuscode.com/blogs/malovicn/Images/HowtodomultipleinheritanceinCImplementat_C41C/Solution210.png

Programmer's Drinking Song: 99 little bugs in the code, 99 bugs in the code, Fix one bug, compile it again, 100 little bugs in the code. (go to start if bugs>0)


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Kun je geen (abstracte?) base class maken met de gemeenschappelijke functionaliteit in?

code:
1
2
3
                                /-- ControlX
UserControl <---- BaseControl <---- ControlY
                                \-- ControlZ

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
De oplossing die H!GHGuY aandraagt, lijkt me ook de meest plausibele.
Alleen, een abstracte UserControl kan je niet echt maken, want VS.NET kan daar niet zo goed mee overweg. (Controls die inheriten van een abstracte control, kunnen niet in de designer getoond worden; althans dat was toch in vorige versies van VS.NET zo, weet niet of het nu ook nog zo is).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt het ook in de buurt van mutliple inherentence komen door gebruik te maken van compositie.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Verwijderd schreef op zondag 25 mei 2008 @ 10:33:
Je kunt het ook in de buurt van mutliple inherentence komen door gebruik te maken van compositie.
Da's niet echt 'in de buurt van', vind ik.
inheritance blijft 'is a' en compositie is 'has a'.

In de meeste gevallen is composition idd misschien wel 'te weinig gebruikt' tvv inheritance, terwijl composition in veel van de gevallen gewoon de beste keuze is; echter, ik denk niet dat composition hier een afdoende oplossing is voor het probleem.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Brainstorm
  • Registratie: November 2000
  • Laatst online: 03-09 21:47
Wat ik eigenlijk dacht dat de bedoeling is, is dat de bestaande .NET controls (zoals TextBox) uitgebreid worden met eigen functionaliteit. Oftewel, overerven van usercontrol is niet mogelijk.

code:
1
2
Label <----- MyLabel
TextBox <--- MyTextBox


Ik zie dat dit scenario niet expliciet genoemd wordt, maar gezien het feit dat de TS het heeft over multiple inheritance...

Programmer's Drinking Song: 99 little bugs in the code, 99 bugs in the code, Fix one bug, compile it again, 100 little bugs in the code. (go to start if bugs>0)


Acties:
  • 0 Henk 'm!

Verwijderd

whoami schreef op zondag 25 mei 2008 @ 10:36:
Da's niet echt 'in de buurt van', vind ik.
inheritance blijft 'is a' en compositie is 'has a'.
om het verhaal even wat completer te maken:
Je implementeert simpelweg de interfaces om de 'is-a' relatie te verwezenlijken en de daadwerkelijke implementaties doe je doormiddel van compositie. Daarmee heb je hetvolgende probleem opgelost:
Stray678 schreef op zondag 25 mei 2008 @ 03:26:
[..] ik enkel de code kopiëren in iedere klasse (en onderhouden).
Is er een manier om hier iets aan te doen?
Het is natuurlijk wel het betere plumbing code werk maar je hebt in ieder geval geen duplicate code.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

whoami schreef op zondag 25 mei 2008 @ 10:28:
De oplossing die H!GHGuY aandraagt, lijkt me ook de meest plausibele.
Alleen, een abstracte UserControl kan je niet echt maken, want VS.NET kan daar niet zo goed mee overweg. (Controls die inheriten van een abstracte control, kunnen niet in de designer getoond worden; althans dat was toch in vorige versies van VS.NET zo, weet niet of het nu ook nog zo is).
Idd, met die abstract usercontrols moet je oppassen. In VS 2005 heb ik er last mee gehad.
Ik heb het echter nog niet geprobeerd in de 2008 versie.

Je kan dit wel "oplossen" natuurlijk met
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class BaseClass : UserControl
{
  public BaseClass()
  {
    // eventueel zelfs in de constructor:
    // hoewel dit door de afgeleide klasse wel moet ondersteund worden zonder
    // er meteen een rommeltje van te maken
#if DEBUG
    DoeIets();
#endif
  }
  public virtual void DoeIets()
  {
     throw new NotImplementedException();
  }
}

[ Voor 25% gewijzigd door H!GHGuY op 25-05-2008 11:55 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Verwijderd

Welke versie van .NET hebben we 't over? Als we 't hebben over 3.5 is het een en ander misschien op te lossen met extension methods.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Een virtuele methode oproepen in een constructor in .NET is meestal niet zo'n goed idee ....
Als in, niet echt triviaal om na te gaan welke implementatie er nu exact wordt aangeroepen op het moment van object construction ...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 23:46
Dit zou ik doen:

maak een class die erft van .NET control class, bijvoorbeeld MyControl.

Zet in MyControl de shared code.

Erf elke specifieke class van MyControl en voila.


(edit)...


ai. ik zie dat je elk component van een specifieke toolbox control wilt afleiden, dan gaat mijn verhaal niet echt op... :X

Wat je dan alleen nog kunt doen, is de shared code verplaatsen naar een aparte class en deze vanuit elke control aanroepen.

[ Voor 42% gewijzigd door DrDelete op 26-05-2008 07:51 ]


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Extension method op de base class van de controls?
Edit: Sorry, bericht van Tedkees over het hoofd gezien.

[ Voor 45% gewijzigd door riezebosch op 26-05-2008 09:50 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Met extensions kun je niet bij de private (en protected) variabelen en met overerving kun je dat wel. Wat natuurlijk wel kan is dat je je user control als een Cascade naar andere classes bouwt.

Ofwel jouw class erft van een standaard (web)form control en intern maak je gebruik van een aantal helper classes welke voor de extra functionaliteit zorgen. Via interfaces kun je de implementatie afdwingen. Door de Render methode te overriden kun je de gewenste wijzigingen doorvoeren.

Dit is de methode welke wij aanhouden. Multiple Inheritance kan zeer ingewikkeld worden namelijk. Stel class A en class B hebben allebei een public methode DoIets(). Welke van de twee wordt dan uiteindelijk aangeroepen?

Onder andere vanwege die reden hebben ze besloten geen multiple inheritance (MI) op te nemen in C#. Als je echt MI wilt hebben zit er niets anders op dan C++.net te gebruiken om de (abstract) controls op basis van je meerdere basis classes te maken.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Met overerving kan je ook niet bij de private variabelen, enkel bij protected. :)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Stray
  • Registratie: Juli 2003
  • Laatst online: 08-09 22:54
Het gaat hier over .NET 2.0, meer bepaald, het moet lopen op een Win CE 5.0 met compact framework 2.0. (Misschien wordt het nog CE 6.0, maar dat is nog niet zeker).

Ik wil dus inderdaad afleiden van de standaard controls, dus een eigen base class zit er niet in. Het zal dus mbv extra classes worden waarbij mijn eigen controls een field van dit type hebben.

Ik ken het gevaar van multiple inheritance (werk in het dagelijkse leven met C++), maar soms is het wel handig.

Dat hier nog geen slimme kop een design pattern voor ontwikkeld heeft ;)

Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Stray678 schreef op maandag 26 mei 2008 @ 11:01:
Het gaat hier over .NET 2.0, meer bepaald, het moet lopen op een Win CE 5.0 met compact framework 2.0. (Misschien wordt het nog CE 6.0, maar dat is nog niet zeker).

Ik wil dus inderdaad afleiden van de standaard controls, dus een eigen base class zit er niet in. Het zal dus mbv extra classes worden waarbij mijn eigen controls een field van dit type hebben.

Ik ken het gevaar van multiple inheritance (werk in het dagelijkse leven met C++), maar soms is het wel handig.

Dat hier nog geen slimme kop een design pattern voor ontwikkeld heeft ;)
Ik weet niet wat die extra set aan functies is, maar als het om externe bewerkingen gaat kan je deze toch onderbrengen in een static helper class die als input een object van het type System.Windows.Forms.Control krijgen? Of overloaded methods voor specifieke implementaties.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Niemand_Anders schreef op maandag 26 mei 2008 @ 10:04:
Als je echt MI wilt hebben zit er niets anders op dan C++.net te gebruiken om de (abstract) controls op basis van je meerdere basis classes te maken.
No can do. C++/CLI ondersteunt helemaal geen multiple inheritance voor managed classes (logisch ook - het is de VM die het niet support, niet slechts de taal). En je kunt een unmanaged class (waarbij MI wel mogelijk is) niet van een managed class laten overerven.
Onder andere vanwege die reden hebben ze besloten geen multiple inheritance (MI) op te nemen in C#.
Het is een inconvenience, maar niet een onoverkomelijk probleem (in C++ kun je de method aanroepen door 'm de prefixen met z'n baseclass: instance->Base1::method()). Niet echt iets om MI voor te laten. Er kleven veel grotere problemen aan MI, zoals: wie gaat A constructen in de welbekende class A; class B:A; class C:A; class D:B,C overerving structuur. En hoe ga je serialization implementeren in een dergelijke structuur als geen enkele instance de zekerheid heeft of zijn base instance niet geshared wordt door een andere derived class in dezelfde instance.

[ Voor 38% gewijzigd door .oisyn op 26-05-2008 11:36 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
whoami schreef op zondag 25 mei 2008 @ 10:28:
De oplossing die H!GHGuY aandraagt, lijkt me ook de meest plausibele.
Alleen, een abstracte UserControl kan je niet echt maken, want VS.NET kan daar niet zo goed mee overweg. (Controls die inheriten van een abstracte control, kunnen niet in de designer getoond worden; althans dat was toch in vorige versies van VS.NET zo, weet niet of het nu ook nog zo is).
In ieder geval in 2005 kan dit wel (weer) :)

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
roy-t schreef op maandag 26 mei 2008 @ 20:24:
[...]


In ieder geval in 2005 kan dit wel (weer) :)
Ik denk dat je dan iets niet goed getest hebt, want dit lukt nog altijd niet in VS.NET 2005:

Afbeeldingslocatie: http://users.pandora.be/fgzone/pics/abstract_form.JPG

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
^^ En dat werkt in VS2008 ook (nog steeds) niet.
Afbeeldingslocatie: http://tweakers.net/ext/f/ny0HQAA1T8gUvq1K6YHfroMz/full.png

En dit is wat MS erover zegt:
We have no plans to add support support for abstract base classes in this version due to the complexity of changing this. The windows forms designer does create an instance of your class (user control) when you double click the user control in the solution explorer. In fact all of the design time experience is based upon the ability to create the form, control, user control to design it. In the future we might re-visit this and see if there is a change that can be made.
En wat leesvoeier:
http://www.urbanpotato.net/default.aspx/document/1772
http://www.urbanpotato.net/Default.aspx/document/2001

[ Voor 120% gewijzigd door RobIII op 26-05-2008 23:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

Geen idee of dit zou kunnen in C#, ik gebruik dat nooit, maar misschien kan het je op een idee brengen:
Zou je geen gebruik kunnen maken van een template class? Met behulp van een template kan je, in elk geval in C++, overerven van een klasse die je op het moment van het schijven van je class nog niet weet, omdat je kan overerven van je type in je template.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ATS schreef op dinsdag 27 mei 2008 @ 08:02:
Geen idee of dit zou kunnen in C#, ik gebruik dat nooit, maar misschien kan het je op een idee brengen:
Zou je geen gebruik kunnen maken van een template class? Met behulp van een template kan je, in elk geval in C++, overerven van een klasse die je op het moment van het schijven van je class nog niet weet, omdat je kan overerven van je type in je template.
In C# kan je ieder geval niet inheritten van een Generic Type dus iets als het volgende kan niet
C#:
1
2
3
public class MyType<T> : T
{
}

Het lijkt me eigenlijk ook nogal een vreemde constructie.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom is dat vreemd? Goed, voor generics waarbij MyType gecompileerd moet worden zonder te weten wat T is (en de compiler dus niet weet welke methods hij moet overriden, of hoe de base ctor aangeroepen moet worden) is het niet te implementeren, maar het is juist bij problemen zoals die van de TS uitermate geschikt - je kunt standaard functionaliteit toevoegen aan verschillende classes.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op dinsdag 27 mei 2008 @ 10:46:
Waarom is dat vreemd? Goed, voor generics waarbij MyType gecompileerd moet worden zonder te weten wat T is (en de compiler dus niet weet welke methods hij moet overriden, of hoe de base ctor aangeroepen moet worden) is het niet te implementeren, maar het is juist bij problemen zoals die van de TS uitermate geschikt - je kunt standaard functionaliteit toevoegen aan verschillende classes.
Ja oke als je idd zoals bij C++ compile time templates hebt is er wel wat voor te zeggen.

In C# zou je ook wel zoiets kunnen bereiken door wat constraints op te leggen voor de constructor en base-type. Op het moment kun je volgens mij alleen een constraint op een publieke parameterless constructor leggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar hoe ga je afdwingen dat methods wel goed overridden worden e.d.?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op dinsdag 27 mei 2008 @ 11:18:
Maar hoe ga je afdwingen dat methods wel goed overridden worden e.d.?
In de praktijk zal dat lastig zijn. Maal zolang een base-type maar geen methods sealed zou het geen probleem op moeten leveren als een tussenliggend type ook een methode overide.

Ook met abstracte classes heb je natuurlijk een probleem omdat je niet weet of er ergens in de keten al een implementatie is.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public MyBaseControl<T> : T where T : UserControl, new()
{
    public MyBaseControl()
    {
    }
    
    public override void OnLoad(..) { }

    public void SomeFunc()
    {
        Children.Add( new Button() );
    }
}

met zoiets zie ik in theorie niet zoveel problemen. Eventueel zouden ze de new constrained uit kunnen breiden om ook constructors met parameters toe te laten.

[ Voor 29% gewijzigd door Woy op 27-05-2008 11:44 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Stray
  • Registratie: Juli 2003
  • Laatst online: 08-09 22:54
Ik ga vanavond nog wat verder proberen, want het project heeft een paar dagen stil gelegen omwille van een herinstallatie van de PC. Normaal moet straks alles terug up-and-running zijn.

Ik zal het resultaat dan posten.

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

@TS:
Wat eigenlijk nog niet duidelijk is in je verhaal is of je alleen dingen wil toevoegen aan de bestaande controls, of dat je ook functionaliteit moet veranderen daarvoor. Heb je toegang nodig tot de protected members van de controls?

Dat maakt m.i. nogal uit in de mogelijke oplossingen.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • Stray
  • Registratie: Juli 2003
  • Laatst online: 08-09 22:54
Ik wil (tot nu toe) enkele functionaliteit toevoegen. Alle controls implementeren dezelfde Init() method die subscribed op een IO driver, ze hebben allemaal een AutoUpdate property die kan subscriben op een event van de IO driver, enz .....

Maar ik denk dat ik weet waar je naar toe wil.

[code=c#, 0, 4]
public abstract class MyControl
{
public void Init()
{
// default implementation
}

public AutoUpdate { set { /* subscribe */ } }

public System.Windows.Forms.Control Ctrl { get { return ctrl; } }
private System.Windows.Forms.Control ctrl = null;
}

public class MyButton : MyControl
{
public MyButton()
{
ctrl = new System.Windows.Forms.Button();
}
}
[/code]


Edit: Ik moet toch enkele methods overriden, zoals de On_Click .

[ Voor 5% gewijzigd door Stray op 27-05-2008 23:24 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je dan niet iets als het volgende doen?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyUserControl<T> : UserControl where T : Control, new()
{
    public virtual void Init()
    {
        Control myControl = new T();
        Controls.Add(myControl);
        //Doe iets
    }

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        //Do iets
    }

    public bool AutoUpdate { set { /* subscribe */ } }
}

Je heb dan een generiek UserControl die aan de hand van zijn Generic Type een child control toevoegt. Je kunt alle algemene methods gewoon overerven. Je hebt er zo wel weer een extra laag tussen zitten. Als je echt een Button Control wilt hebben zul je denk toch iets met compositie of extension methods moeten doen.

edit:
of je kan het via een abstracte class doen. Dan kan je in je subclass ook nog dingen met het event van Button doen
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public abstract class MyUserControl : UserControl
{
    public virtual void Init()
    {
        Controls.Add(ChildControl);
        //Doe iets
    }

    public abstract Control ChildControl { get; }

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        //Do iets
    }

    public bool AutoUpdate { set { /* subscribe */ } }
}

public class MyButtonControl : MyUserControl
{
    private readonly Control childControl;

    public MyButtonControl()
    {
        childControl = new Button();
    }

    public override Control ChildControl
    {
        get { return childControl; }
    }
}

[ Voor 47% gewijzigd door Woy op 28-05-2008 09:26 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Op die manier wrap je wel altijd het control in een UserControl?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ja dat bedoel ik met
Je hebt er zo wel weer een extra laag tussen zitten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Stray
  • Registratie: Juli 2003
  • Laatst online: 08-09 22:54
Het zal met een abstracte class moeten, aangezien de te overidden methods afhankelijk zijn van het type control. Bv. MyButton moet de OnPaint() overriden, maar MyLabel niet. Dus kan ik niet met een generic werken.

Acties:
  • 0 Henk 'm!

  • Stray
  • Registratie: Juli 2003
  • Laatst online: 08-09 22:54
Update:
Wanneer ik de control laat overerven van een base control (die op zijn beurt overerft van Forms.Control) worden de events zoals OnPaint() niet meer getriggered.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public abstract class BaseControl : Control {

    public void Init(string var, Device dev) {

        Controls.Add(Ctrl);
       
        // some more intializations
    }

    public abstract void OnNotification(object sender, EventArgs e);

    public Control Ctrl { 
        get { return _ctrl; }
        protected set { _ctrl = value; } 
    }

    private Control           _ctrl;
}

public class LightButton : BaseControl {

    public LightButton() {

        Ctrl = new System.Windows.Forms.Control();
    }


    public override void OnNotification(object sender, EventArgs e) {
       // handle update
    }

    protected override void OnPaint(PaintEventArgs e) {
       // draw custom image
    
        base.OnPaint(e);
    }

    protected override void OnPaintBackground(PaintEventArgs e) {
        //Do nothing
    }

    protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) {
        _pushed = true;
        this.Invalidate();
    }

    protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e) {
        _pushed = false;
        this.Invalidate();
    }

    protected override void OnClick(EventArgs e) {
        // TODO Toggle light output
        base.OnClick(e);
    }
}


Ik ga wel even niet kunnen reageren want ik vertrek morgen op vakantie
Pagina: 1