ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4396332
Jetzt (Chat):
22 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Sourcecode-Probleme
Re: C# Generics Problem
Normal
AutorThema
NeoInferno Offline
ZFX'ler


Registriert seit:
10.09.2002

Deutschland
C# Generics ProblemNach oben.
Hi,

ich habe folgendes Problem mit generischen Typen in C#, dass ich hoffentlich anschaulich erklären kann:

Ich habe (bzw. möchte) eine abstrakte Basisklasse, die etwa so aussieht:
Code:
public abstract class
GameObjectManager : GameObject
        where GameObjectType : ManagedGameObject>

Unterklassen davon verwalten einen bestimmten Objekttyp, der aber immer ein ManagedGameObject ist.

Nun möchte ich, dass diese ManagedGameObjects jeweils auf ihren Manager Zugriff haben - er soll per Konstruktor übergeben werden:
Code:
public abstract class ManagedGameObject : GameObject
where ManagerType : GameObjectManager>

public ManagedGameObject(ManagerType manager)
{
manager.DoSomething(this);
}


Das Problem ist, dass es anscheinend nicht möglich ist, einen generischen Typ als Typparameter eines andere generischen Typs zu verwenden.
Ich möchte quasi eine beidseitig typsichere Abhängigkeit zwischen den Managern, die jeweils ein bestimmtes ManagedGameObject verwalten und den ManagedGameObject, die ihren bestimmten Manager kennen und dort auf Methoden etc. Zugriff haben.

Hoffentlich ist relativ verständlich, was ich hier meine.
Hat jemand eine Idee, wie ich das oben dargestellte System implementieren kann?

Gruß,
Neo
03.02.2009, 18:35:50 Uhr
Neochat
frittentuete Offline
ZFX'ler


Registriert seit:
08.03.2005

Hamburg
Re: C# Generics ProblemNach oben.
hi,

wie ich sehe, sind hier kaum Leute mit C#-Erfahrung vorhanden, ich auch nicht, muss ich sagen.

Deswegen kann ich nur etwas anbieten, was ich mir angelesen habe. Es gibt ja auch generische Methoden, kann man die auch bei Konstruktoren nutzen? Sonst könnte man ja sowas machen:

Code:
public ManagedGameObject(TestManagerType manager) {

     if(TestManagerType is ManagerType)
          manager.DoSomething(this);
}


Sonst mal in einem C#-Forum nachfragen.

frittentuete
04.02.2009, 17:26:39 Uhr
Richard Schubert Offline
DX-Berater


Registriert seit:
05.12.2002

Berlin
85557876 rs@directx9.de
Re: C# Generics ProblemNach oben.
wenn ich dein problem richtig verstanden habe ist genau ein generic constraint von c# ein problem.

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx
der vorletzte punkt?

1 Mal gendert, zuletzt am 04.02.2009, 17:56:03 Uhr von Richard Schubert.
04.02.2009, 17:55:36 Uhr
DirectX 10
frittentuete Offline
ZFX'ler


Registriert seit:
08.03.2005

Hamburg
Re: C# Generics ProblemNach oben.
hi,

hier ist auch nochmal eine Möglichkeit, weiß nicht genau, ob sie für dich in Frage kommt:

http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx

Also ich meine in der generischen Klasse eine nicht-generische private Klasse zu erstellen, dort darf man dann den generischen Typ im Konstruktor angeben.

frittentuete
04.02.2009, 19:14:13 Uhr
NeoInferno Offline
ZFX'ler


Registriert seit:
10.09.2002

Deutschland
Re: C# Generics ProblemNach oben.
Danke für eure Vorschläge, werd die Sachen mal ausprobieren
Momentan habe ich das so gelöst, dass ein ManagedObject erstmal nicht generisch ist. Somit muss ich leider spezifische Sachen, die eigentlich dort rein gehören, in den Unterklassen definieren, aber immerhin was.
05.02.2009, 20:21:25 Uhr
Neochat
odenter Offline
ZFX'ler


Registriert seit:
13.12.2002

Bremen
Re: C# Generics ProblemNach oben.
Also Generics nehmen auch Generische Typen auf.
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2 {

  class Point {
    public TType Field;
    
    public void Test(TType1 T1) {
    }
  }

  class Program {
    static void Main(string[] args) {
    
      Point> aa = new Pointint>>();
      aa.Field = new Point<int>();
      aa.Test<double>(2);
      aa.Test(123);
      aa.Test(\"Hallo\");
    
      List l = new List();
      l.Add(\"eins\");
      l.Add(\"zwei\");
      aa.Test>(l);
    }
  }
}


Falls Du das mit den Methoden unten meinst (double/int, string) das wäre ja absolut grausam. Da würde ich das lieber mit Schnittstellen machen, weniger mögliche Fehlerquellen.

Also sowas wie
Code:
// ggf. auch hierfür ein Interface
Interface IGameObject {
}

class GameObject {
  private IManager managerValue;

  public GameObject(IManager mgr) {
    managerValue = mgr;
  }
}

Interface IManager {
  List GameObject { get; set; }
}

Interface IManagerEins {
  void MehtodeNurInManagerEins();
}

Interface IManagerZwei {
  void MehtodeNurInManagerZwei();
}

class Manager : IManager {
}

class ManagerEins : IManager, IManagerEins {
}

class ManagerZwei : IManager, IManagerZwei {
}


Das ganze geht natürlich auch ohne Interfaces, einfach so mit Klassen.

13 Mal gendert, zuletzt am 26.02.2009, 12:50:50 Uhr von odenter.
26.02.2009, 11:53:33 Uhr
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel