C# List<Interface> Serialisieren

...komplette Frage anzeigen

1 Antwort

Der Code kommt mir reichlich sinnfrei vor. Rooms sollte kein Interface verwalten, sondern die Klasse Room. Die Klasse Room mag zwar schon ein Interface namens IRoom implementieren. Und wenn jemand die Klasse Rooms nach einen Room frägt, dann kannst du hier ruhig IRoom zurückgeben, sodass der potenzielle Aufrufer anstatt der konkreten Implementierung von Room eben IRoom bekommt. So ist sichergestellt, dass es austauschbar bleibt. Aber was du hier betreibst, ist einfach nur sinnfrei.

Du solltest dir die Bedeutung von Interfaces nochmal genau vor Augen führen. Mach die Liste zu einer

List<Room>

und du kannst es auch serialisieren. Was ActualRooms hier soll, dass versteh ich auch nicht. Für was brauch ich das, wenn die Member-Variable "_rooms" public ist? Sobald ich Rooms instanziert habe, kann ich da eh drauf zugreifen. Also, hier ist auch design-technisch einiges im Argen. _rooms hat hier privat zu sein. Und ob man diese private List dann einfach so rausgibt, ist auch noch ein Thema, über das man diskutieren könnte.

Drogenreferat 06.03.2014, 09:47

Wieso das zu dem Zeitpunkt auf Public war, war weil ich dort ein bisschen mit dem Serialisieren experimentiert habe, ob vielleicht etwas geht. Natürlich hast du recht und ein Attribut gehört auf Private.

Das mit den Interfaces jedoch stimmt nicht. Ich brauche dieses Interface.

Auf List kann ich es auch nicht ändern. So ist es am einfachsten aber das ist nicht mein Ziel. Ich brauche die Interfaces und auch möchte ich nicht meine vollständige List zurückgeben sondern nur ein IEnumerable.

0
Marbuel 06.03.2014, 11:39
@Drogenreferat

Es macht keinen Sinn, dass Interface in die Liste zu geben. Für was bitteschön solltest du das brauchen? Wie soll er das bitte serialisieren? Du willst den Objektzustand serialisieren, sodass selbiger nach dem deserialisieren wieder vorhanden ist. Wie soll er das machen, wenn du eine Liste mit Interfaces hast?

Ich weiß nicht, was dein Ziel ist, aber es ist wirr. Sag mir einen Grund, warum die Liste in Rooms nicht Room verwalten sollte, sondern IRoom.

Was du anscheinend willst, ist IRoom anstelle von Room zurückgeben. Und du willst anscheinend, dass man über Rooms loopen kann, sodass man gleichzeitig aber jeweils das Interface von Room und nicht die konkrete Implementierung der Klasse Room auf der Hand hat.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Rooms rooms = new Rooms();
         rooms.AddRoom(new Room());
         rooms.AddRoom(new Room());
         foreach (IRoom roomWalk in rooms)
         {
            roomWalk.OpenDoor();
         }
         IRoom myRoomInterface = rooms.GetRoomByPos(2);
      }
   }
   public class Rooms : IEnumerable<IRoom>
   {
      private List<Room> m_lRooms;
      public Rooms()
      {
         m_lRooms = new List<Room>();
      }
      public void AddRoom(Room roomToAdd)
      {
         m_lRooms.Add(roomToAdd);
      }
      public IRoom GetRoomByPos(int i4Pos)
      {
         if (m_lRooms.Count >= i4Pos)
            return (IRoom)m_lRooms[--i4Pos];

         return null;
      }
      IEnumerator IEnumerable.GetEnumerator()
      {
         return (IEnumerator)GetEnumerator();
      }

      public IEnumerator<IRoom> GetEnumerator()
      {
         foreach (Room roomWalk in m_lRooms)
         {
            if (roomWalk == null)
            {
               break;
            }
            yield return (IRoom)roomWalk;
         }
      }
   }
   public class Room : IRoom
   {
      public void OpenDoor()
      {
         Console.WriteLine("The door is open");
      }

      public void DoAnything()
      {
         //anything
      }
   }
   public interface IRoom
   {
      void OpenDoor();
   }
}
0
Drogenreferat 06.03.2014, 14:40
@Marbuel

Ich mach Momentan meine Ausbildung als Fachinformatiker. Und mein Ausbilder hat mir ein Programm strikt vorgegeben. Das einzigste was schwer war, dass man Interfaces nicht Serialisieren kann, und dass brauchte ich, da ich die Liste in ein XML - File speichern muss. Ich habe es jetzt auch hinbekommen, indem ich mir das selber schreibe mit IXmlSerializable. Etwas umständlich aber es klappt im Endeffekt. Einen einfachen Weg hätte ich auch selber hinbekommen, aber es immer zu Leicht machen ist nicht immer das schönste ;)

0
Marbuel 06.03.2014, 15:22
@Drogenreferat

Hab selbst Anwendungsentwickler gelernt und arbeite bereits seit ca. 6 Jahren beruflich als Entwickler. Und wenn das euch von eurem Lehrer so vorgegeben wurde, dann gibt es meiner Meinung nach zwei Möglichkeiten, warum dem so ist. Entweder, er wollte euch absichtlich vor dieses Problem stellen, oder er weiß schlicht nicht, was er tut. Bei mir in München gab es genau einen Lehrer für Anwendungsentwicklung, welcher wirklich Ahnung hatte. Ganz einfach, weil er selbst 20 Jahre als Entwickler tätig war.

Alle anderen konntest du in der Pfeife rauchen.

Es ging mir bei meinem Einwand nicht darum, einem Problem aus Faulheit aus dem Weg zu gehen. Was du da oben betreibst, ergibt für mich keinen Sinn. Dabei bleibe ich. Es gibt überhaupt keinen plausiblen Grund, warum Rooms Room als Interface in der Liste verwalten sollte. Außer, er wollte wie gesagt einfach nur schauen, wer von euch so schlau ist und die Implementierung von IXmlSerializable selbst vornimmt. Abseits von dieser Möglichkeit ist das ganze in meinen Augen einfach Humbug².

0
Drogenreferat 06.03.2014, 15:55
@Marbuel

Nein das denke ich nicht. Er hat mir noch nie eine "überflüssige" Aufgabe gegeben. Klar, dieses Programm grad ist klein sodass ich einige Interfaces nicht bräuchte, aber für die späteren größeren Programme sollte ich wissen wie ich damit umgehe.

0

Was möchtest Du wissen?