Entwickler-Ecke

C# - Die Sprache - Abstrakte Classen


goose - Mo 11.09.06 21:46
Titel: Abstrakte Classen
Hallo,

ich beginne gerade mich mit C# zu beschäftgen, bin also absoluter Anfänger und hab so einige schwierigkeiten.
Ich arbeite gerade so ein Buch durch, nennt sich Einstieg in Visual C# 2005 vom Master Verlag.

Also ich versteh nicht ganz warum folgendes nicht geht :

clogging.cs


C#-Quelltext
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:
namespace AbstrakteKlassen
{
  // Grunlegende Klasse
  public abstract class CLogging
  {
    string szLog;
    // Text dem Log hinzufügen
    public void Add(string LogText)
    {
      szLog = szLog + LogText;
    }
    // log löschen
    public void Clear()
    {
      szLog = "";
    }
    // Log Inhalt zurückgeben
    public string LogInhalt()
    {
      return szLog;
    }
    // Diese Methode muss überschrieben werden
    public virtual void save()
      {}
  }

  // Klasse für konsole logging
  public class KonsoleLogging : CLogging
  {
    public override void save()
    {
      Console.WriteLine(LogInhalt());
    }
  }

  // Klasse für DateiLogging
  public class FileLogging : CLogging
  {
    public void Test()
    {
      Console.WriteLine("Test");
    }
  }
}


cmain.cs


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
namespace AbstrakteKlassen
{
  class CMain
  {
    static void Main()
    {
      CLogging FLog = new FileLogging();
      FLog.Test();   //<========================== Hier, warum geht das nicht ??????? =======================

      Console.ReadLine();
    }
  }
}



ich glaube das ist jedem klar worum es hier geht.
Eine abstrakte klasse CLogging und davon abgeleitet FileLogging mit der Methode Test().
Aber warum kann ich nicht auf die Methode zugreifen ?

Matthias


Christian S. - Mo 11.09.06 22:07

Hallo!

Flog hast Du ja als Clogging deklariert. Damit kannst Du auch (falls Du nicht castest) nur die Methoden benutzen, die in der Klasse CLogging "bekannt" sind. Und das ist Test nunmal nicht. Du kannst Test aber, da Du Flog als FileLogging instanziert hast, über den Umweg eines Casts aufrufen:


C#-Quelltext
1:
((FileLogging)Flog).Test                    


Grüße
Christian


goose - Mo 11.09.06 22:34

Hallo,

ich danke Dir für die Antwort obwohl ich das so ohne Erklärung nicht verstanden habe.
Ich hab jetzt gefummelt und gefummelt und glaube ich habs jetzt :


C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Text;

namespace Abstract
{
  class CMain
  {
    static void Main(string[] args)
    {
      CBase Base = new CAbgeleitet_von_Base();
      CAbgeleitet_von_Base Abgeleitet = new CAbgeleitet_von_Base();

      Base.BaseMethode1();
      Base.BaseAbstrakt();

      Abgeleitet.Methode_in_Abgeleiteter_Klasse();


      Console.ReadLine();
    }
  }

  
  // Grundlegende Klasse
  public abstract class CBase
  {
    // Methode 1
    public void BaseMethode1()
    {
      Console.WriteLine("BaseMethode 1");
    }
    // Abstrakte Methode die überschrieben wird
    public abstract void BaseAbstrakt();
  }
  
  // von Base Abgeleitete Klasse soll alles von Base Klasse erben
  // und erweitert werden
  public class CAbgeleitet_von_Base: CBase
  {
    // Überschriebene Methode der Base Klasse
    public override void BaseAbstrakt()
    {
      Console.WriteLine("Überschrieben Methode");
    }
    
    // Kann ich hier nicht die Abgeleitete Klasse erweitern ???? 
    public void Methode_in_Abgeleiteter_Klasse()
    {
      Console.WriteLine("Abgeleitete Methode");
    }
  }
}


Ist das so richtig gemacht ?
Mir kommt das irgendwie so umständlich vor ?

Matthias