Avatar billede htm Nybegynder
21. august 2004 - 16:06 Der er 17 kommentarer og
2 løsninger

Arve fra to klasser

Hej

Jeg bruger VS.NET 2003 og har behov for at arve fra to klasser i en af mine forme.

Den ene klasse er System.Windows.Forms.Form og den anden er en jeg selv har lavet, lad os kalde den MinKlasse

Jeg har prøvet følgende:

----- Form1.cs start -----
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;

namespace MitProject
{
    public class Form1 : MinKlasse
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            base.Dispose( disposing );
        }
       
        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            //
            // Form1
            //
            this.BackColor = System.Drawing.Color.White;
            this.ClientSize = new System.Drawing.Size(234, 295);
            this.Text = "Form1";

        }
        #endregion

        static void Main()
        {
            Application.Run(new Form1());
        }
    }
}
----- Form1.cs slut -----

----- MinKlasse.cs start -----
using System;

namespace MitProject
{
    public class MinKlasse : System.Windows.Forms.Form
    {
        public MinKlasse()
        {

        }
    }
}
----- MinKlasse.cs slut -----

Men det virker ikke - eller det vil sige applikationen virker fint, men designeren i VS kan slet ikke finde ud af det.

Jeg får denne fejl når jeg forsøger at se designet i VS:
"The designer could not be shown for this file because none of the classes within it can be designed.  The designer inspected the following classes in the file:

    Form1 --- The base class 'MitProject.MinKlasse' could not be loaded.  Ensure the assembly has been referenced or built if it is part of the project."

Eller også betragter den MinKlasse som en form og kan ikke finde ud af det med form1

Det skal lige sige at jeg bruger Compact Framwork, hvis det skulle gøre en forskel.

Men hvad gør jeg galt? Hvordan får jeg form1 til at arve fra System.Windows.Forms.Form og MinKlasse ?
Avatar billede snepnet Nybegynder
21. august 2004 - 16:23 #1
Multibel arv er ikke understøttet i C# på den måde at du kan arve fra to forskellige klasser, som dem du viser, men det er jo heller ikke det du prøver at gøre (i hvert fald ikke i det kode du har lagt herud).

Det kode du har lagt her skulle der ikke være nogle problemer i - det skulle bygge fint, og designeren skulle også opføre sig fint nok.
fejlen du har sendt indikerer at du ikke har bygget MinKlasse inden du prøvede at vise Form1 i designeren.
Avatar billede htm Nybegynder
21. august 2004 - 16:40 #2
Hej igen

Jeg har lige forsøgt helt forfra, met et lille testproject:

1. New project
2. Visual C# Projects - Smart Device Application - MitProject
3. Windows CE - Windows Application
4. Width: 240 - height: 320
5. Add new class
6. MinKlasse.cs
7. ret public class MinKlasse til public class MinKlasse : System.Windows.Forms.Form
8. Gem MinKlasse
9. Ret public class Form1 : System.Windows.Forms.Form til public class Form1 : MinKlasse
10. Gem alt - kompiler, ingen kompilerfejl og det virker fint.
11. Luk VS
12. Åben VS igen og åben solution og får så følgende fejl:

" Object type cannot be converted to target type."
" Error reading resources from the resource file for the default culture: Invalid ResX input.  Could not find valid "resheader" tags for the ResX reader & writer type names."

og Formen har mistet sin bredde og højde, som jeg satte i punkt 4.

Sætter dem tilbage igen kompilerer og får en masse fejl, bla den jeg smed før.

Jeg forstår det ikke - kan du forklare mig hvad jeg gør galt?
Avatar billede snepnet Nybegynder
21. august 2004 - 17:05 #3
Næh... det kan jeg ikke umiddelbart... jeg har lige prøvet at lave det samme her, med samme resultat.. fejl efter man åbner vs igen.
jeg har ikke arbejdet så meget med den projekttype, og har aldrig lavet en baseform i sådan et projekt - jeg kan godt nok ikke forstå hvad der skulle være i vejen for at gøre det.

jeg kunne løse det ved at slette ressourcefilerne, og kommentere de ting ud kompileren fejlede på, og som vs tilsyneladende havde sat ind.

problemet synes ikke at optræde i andre projekttyper - mon der ligger en bug her et eller andet sted ?!?
Avatar billede htm Nybegynder
21. august 2004 - 17:15 #4
Du har ret ingen fejl ved brug af eks. Windows Application, men det er nødvendigt med SmartDevice da den skal bruge Compact Framework.

Det ser ud til at de egenskaber der er til rådighed på form1 efter at have åbnet projektet igen er de almindelige egenskaber og ikke CompactFrameWork egenskaber.

Men selve projektet er stadig CompactFrameWork, derfor den fejler.

Men hvorfor faen skal den lave egenskaberne om til Almindeligt FrameWork ??

Ville være ret med en løsning, men som du siger syntes jeg det minder mere og mere om en bug.
Avatar billede driis Nybegynder
22. august 2004 - 14:19 #5
Bare af ren nysgerrighed, er der nogen, der har et link til en forklaring af argumenterne for at udelade multipel arv i C# ? For hvis man spørger MS får man vel en forklaring noget i retning af "it's not a bug, it's a feature" ?
Avatar billede snepnet Nybegynder
22. august 2004 - 14:22 #6
næh.... jeg tror at du får det svar at det teknisk set godt kan lade sig gøre, men man har udeladt det fordi det generelt giver for mange problemer.
Avatar billede snepnet Nybegynder
22. august 2004 - 14:25 #7
eller rettere... jeg tror bare at kompileren ikke giver dig lov med mindre den anden (de andre) klasse(r) er et interface :o)
arne_v kan formegentlig fortælle dig meget mere om det hvis han kommer forbi her - han er rigtig skrap til sådan noget.
Avatar billede htm Nybegynder
26. august 2004 - 21:47 #8
Nogen der har forslag til løsning? evt. andre muligheder for at finde en løsning?

Er der nogle der ved hvordan jeg kommer i kontakt med Microsoft for at finde ud af om dette er en bug eller ikke?
Avatar billede snepnet Nybegynder
26. august 2004 - 22:08 #9
Du kan skrive til dem herfra hvis det skal være :
http://register.microsoft.com/contactus30/contactus.asp?domain=msdn
Avatar billede htm Nybegynder
29. august 2004 - 18:44 #10
Hmmm - CompactFramework, det skal man altså nødigt rode med ;) - man løber ind i alt for mange begrænsninger.

Dette er åbenbart en begrænsning også, hvor det kun er muligt at arve direkte fra System.Windows.Forms.Form og ikke igennem en anden klasse. Suk...

Jeg lader spøgsmål stående åben, i håb om der skulle dukke noget op.
Avatar billede htm Nybegynder
18. september 2004 - 16:26 #11
Ja i CompactFramework skal man som sagt arve direkte fra System.Windows.Forms.Form hvis man vil bruge det.

snepnet>> Smider du et svar så du trods alt kan få lidt point ?
Avatar billede snepnet Nybegynder
18. september 2004 - 16:28 #12
ok :o)
Avatar billede arne_v Ekspert
18. september 2004 - 17:11 #13
Jeg kom forbi nu.

Det er meget sjældent at man har brug for multipel implementations arv
(arve fra mere end en klasse som indeholder implementation - altså i C# sprog
ikke er interface).

Multipel implementations arv kan godt bruges fornuftigt. Men det kan også
bruges meget ufornuftigt.

Et kendt problem er "Diamond of Death". Vi har en klasse Parent. Vi har en klasse
Child1 som arver fra Parent. Vi har en klasse Child2 som også arver fra Parent.
det er helt fint. Så laver vi en klasse X som arver både fra Child1 og Child2.
Og så har vi problemer.

Overvej f.eks. hvad følgende program skriver ud:

#include <iostream>

using namespace std;

class Number
{
  private:
      int num;
  public:
      Number() { num=0; };
      void SetNum(int n) { num = n; };
      int GetNum() { return num; };
};

class IncrOneNumber : public Number
{
  public:
      IncrOneNumber() : Number() { };
      void IncrOne() { SetNum(GetNum()+1); };
      void print() { cout << GetNum() << endl; };
};

class IncrFiveNumber : public Number
{
  public:
      IncrFiveNumber() : Number() { };
      void IncrFive() { SetNum(GetNum()+5); };
      void write() { cout << GetNum() << endl; };
};

class IncrOneAndFiveNumber : public IncrOneNumber, public IncrFiveNumber
{
  public:
      IncrOneAndFiveNumber() : IncrOneNumber(), IncrFiveNumber() { };
};

int main()
{
  IncrOneAndFiveNumber n;
  n.IncrOne();
  n.IncrFive();
  n.print();
  n.write();
  return 0;
}
Avatar billede arne_v Ekspert
18. september 2004 - 17:12 #14
Svaret er:
1
5

Hvor de fleste nok ville have forventet:
6
6
Avatar billede arne_v Ekspert
18. september 2004 - 17:12 #15
(eksemplet er i C++)
Avatar billede arne_v Ekspert
18. september 2004 - 17:13 #16
Så Java valgte at droppe multipel implementations arv og .NET valgte
at droppe multipel implementations arv.
Avatar billede htm Nybegynder
18. september 2004 - 17:38 #17
arne_v> Ja det ser problematisk ud... Meget interessant :)

Men her handler det vel ikke om multiple arv?

class1 arver fra class2 som arver fra System.Windows.Forms.Form.

Det virker fint i både alm .NET framework og compactframework.

men designeren i smart Device kan ikke finde ud af det og fejler, hvor i mod alm windows app virker fint. Lidt frustrende :)

Men tak for indblik i multiple arv problematikken.
Avatar billede arne_v Ekspert
18. september 2004 - 17:44 #18
Det har du het ret i. Det var driis som bragte det på bane (22/08-2004 14:19:52).

Relationen til dit spørgsmål er vel at hvis multipel implementations arv var muligt
så kunne du snyde den designer ved at arve fra både class2 og Form.
Avatar billede htm Nybegynder
18. september 2004 - 18:24 #19
Det er korrekt :) Havde faktisk ikke lige tænkt på driis s spørgsmål. Men det er dejligt  med en forklaring.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester