Avatar billede nielsenmathias Nybegynder
06. december 2006 - 14:29 Der er 6 kommentarer og
1 løsning

Design af program, "ambiguous reference between classes"

Hejsa.
Jeg har et program bestående af en hovedklasse i ét namespace, som skal benytte én af to .dll-libraries som selvfølgelig er i hvert sit namespace. de to .dll-libraries' implementering er forskellig med de indeholder begge en klasse dllControl der styrer dem. 

Ved opstart skal der oprettes to instanser af hovedklassen der hver skal indeholde en reference til sin dllControl i sin dll. Hovedklassens implementering skal dog være ens for de to instanser, så en instans af dllControl i hovedklassen kan referere til begge dll'er.

Hvordan fortæller man compileren at hovedklassens dllControl
objekt skal referere det der bliver bestemt på compile-tidspunkt uden at få en "ambiguous reference between classes". Fejlen opstår selvfølgelig fordi at dllControl er implementeret i begge dll'er, men det er jo faktisk med vilje.

mit problem minder lidt om nedenstående kodesnit:

using x;
using y;

namespace x
{
  public class Test
  {
  }
}

namespace y
{
  public class Test
  {
  }
}

public class a
{
  public static void Main()
  {
      Test test = new Test();  // CS0104, is Test in x or y namespace?
      // try the following line instead
      // y.Test test = new y.Test();
  }
}

Jeg kan bare ikke sige y.Test for jeg ved jo netop ikke om det er x eller y jeg skal anvende.
For yderligere at specificere problemet, er hovedklassen en "picturebox" der skal tegne figurer. figurerne er beskrevet i hver sit dll-library.
Avatar billede segato Nybegynder
06. december 2006 - 17:51 #1
Det gør du ved at angive namespacet.

x.Test obj = new x.Test();
Avatar billede segato Nybegynder
06. december 2006 - 17:55 #2
Nå jeg var vist lidt for hurtigt ude, tror du skal uddybe dit problem lidt. Men har du klasser med samme navn er de nød til at være i hver sit namespace. Vil du teste om en klasse hører til et namespace kan du jo skrive:

if(obj is y.Test)
Avatar billede driis Nybegynder
06. december 2006 - 19:59 #3
Din kode giver ingen mening. Hvordan skal compileren på nogen måde finde ud af, hvilken Test klasse, den skal instantiere ?

Jeg tror du er nødt til at forklare dig nærmere, og evt. poste noget mere kode.

Namespaces bruges udelukkende til at organisere typer i logiske og overskuelige områder, og for at undgå name clashing, som er det du oplever. Man kan ikke implementere "polymorfi via namespaces", som din postede koder måske minder en smule om ;-)
Avatar billede arne_v Ekspert
06. december 2006 - 21:52 #4
maaske er det noget a la dette eksempel du leder efter:

i.cs
----

public interface I
{
    void Doit();
}

a.cs
----

using System;

public class A : I
{
    public void Doit()
    {
        Console.WriteLine("I am A");
    }
}

b.cs
----

using System;

public class B : I
{
    public void Doit()
    {
        Console.WriteLine("I am B");
    }
}

main.cs
-------

using System;
using System.Reflection;

class MainClass
{
    public static void test(string dllname, string classname, string methodname)
    {
        I o = (I)Assembly.Load(dllname).CreateInstance(classname);
        o.Doit();
    }
    public static void Main(string[] args)
    {
        test("A", "A", "Doit");
        test("B", "B", "Doit");
    }
}

build.bat
---------

csc /t:library /out:I.dll I.cs
csc /t:library /r:I.dll /out:A.dll A.cs
csc /t:library /r:I.dll /out:B.dll B.cs
csc /t:exe /r:I.dll /out:Main.exe Main.cs
Avatar billede nielsenmathias Nybegynder
12. december 2006 - 20:27 #5
yeps arne_v noget i den stil :) Jeg takker og undskylder det sene svar.
Avatar billede nielsenmathias Nybegynder
20. december 2006 - 13:05 #6
post et "svar" så får du lidt point :)
god jul
Avatar billede arne_v Ekspert
21. december 2006 - 01:37 #7
ok

i lige maade
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