Autor Beitrag
traceurmicha
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 160
Erhaltene Danke: 9

Win XP SP2, Win 7 Pro., Ubuntu 9, Debian 5
C#, ASP.NET, MSSQL, PHP(Microsoft Visual Studio 2010 Ultimate, SharpDevelop 4, Microsoft SQL Server2008 Express, Eclipse for PHP)
BeitragVerfasst: Mo 21.10.13 13:44 
Hallo, ich habe eine Klasse Presence im Namespace Firmenname.Verwaltung.Anwendung, diese möchte ich erweitern, im Namespace Anwesenheit habe ich also noch eine Klasse Presence.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
namespace Anwesenheit
{
    #region Klasse Presence
    
    public class Presence : Firmenname.Verwaltung.Anwendung.Presence
    {
        #region Öffentliche Konstruktoren

        /// <summary>
        /// Initialisiert ein leeres Presence Objekt
        /// </summary>
        public Presence()
            :base()
        {
            
        }
        public bool Save()
        {
            //hier ist die Speicherlogik drin
        }
    }
}


Wenn ich jetzt in einem Webservice der ebenfalls im namespace Anwesenheit liegt ein Objekt Presence erzeuge und Save aufrufen will geht das nicht mit der Fehlermeldung

ausblenden Quelltext
1:
enthält keine Definition für "Save", und es konnte keine Erweiterungsmethode "Save" gefunden werden, die ein erstes Argument vom Typ "Firmenname.Verwaltung.Anwendung.Presence" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)					


Nun ist die Frage warum? Und wie kann ich die Methoden erweitern?

_________________
Programmieren ist ein Rennen zwischen den Softwareentwicklern, die versuchen größere und bessere idiotensichere Programme zu schreiben und dem Universum, welches versucht größere und bessere Idioten zu produzieren. Zur Zeit liegt das Universum in Führung.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 21.10.13 14:39 
Zitat:
Nun ist die Frage warum? Und wie kann ich die Methoden erweitern?


Du meinst du willst eine vorhandene Klasse um eine weitere Methode erweitern oder du willst eine vorhandene Methode um Funktionalität erweitern?

a.) wenn du keine interna von Anwendung.Presence brauchst (Dinge die als internal oder protected markiert sind) dann schreib eine Extension Method anstatt eine neue Klasse abzuleiten.
b.) du überschreibst die Save Methode aus Anwendung.Presence. Dafür muß die aber auch in Anwendung.Presence vorhanden sein.
c.) du programmierst an der entsprechenden Codestelle auch gegen Anwesenheit.Presence und nicht gegen Anwendung.Presence denn nur die hat im Moment scheinbar die Save Methode.
d.) siehe bei @TH69 (das offensichtliche glatt übersehen)


Zuletzt bearbeitet von Ralf Jansen am Mo 21.10.13 14:42, insgesamt 2-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 21.10.13 14:41 
Hallo,

Klassen können in C# nur mit dem Schlüsselwort partial erweitert werden oder aber alternativ in einer statischen Klasse eine Erweiterungsmethode schreiben (die als ersten Parameter this Klassenname hat.

So wie du es jetzt geschrieben hast, erstellt du eine neue Klasse im Namensbereich Anwesenheit, welche von der gleichnamigen Basisklasse (aber aus dem anderen Namensbereich) erbt.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 21.10.13 15:43 
Schaut euch doch mal die Fehlermeldung an ^^


Er übergibt der Methode einen Parameter vom Typ "Firmenname.Verwaltung.Anwendung.Presence" und es ist keine Methode von diesem Typ da.


Wozu brauchst du denn überhaupt den Parameter? Reicht nicht die eigene Instanz zum Speichern aus? Und die hast du, da du ja von diesem Typ erbst. Bei Erweiterungsmethoden hättest du die Instanz auch.

Wenn du also die Presence speichern möchtest, die das aktuelle Object darstellt, dann würde ich den Parameter weg lassen und in der Methode Save this benutzen.




Allerdings, wie die Anderen schon geschrieben haben, bietet sich hier eine Erweiterungemethode an, wenn du keine internen Dinge der Klasse benötigst:

ausblenden C#-Quelltext
1:
2:
3:
4:
public static void Save( this Firmenname.Verwaltung.Anwendung.Presence source)
{
    // Speicher-Logikt mit source
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 21.10.13 15:51 
Zitat:
Er übergibt der Methode einen Parameter vom Typ "Firmenname.Verwaltung.Anwendung.Presence" und es ist keine Methode von diesem Typ da.


Nein. Er ruft einfach Save() auf. Nur halt an einer Klasse die das nicht hat. (Und wenn wir jetzt die BestPractices Designtheorie auspacken vermutlich auch nicht haben sollte ;) )
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 21.10.13 21:42 
Ich dachte VS wirft diese Fehler-Meldung, wenn die Methode da ist, aber die Parameter nicht passen.


Naja, wie auch immer, (an traceurmicha) dann instanziirt du wahrscheinlich einfach über die Basis-Klasse und nicht über die erbende Klasse.

Das hier:
ausblenden C#-Quelltext
1:
var presence = new Firmenname.Verwaltung.Anwendung.Presence();					

ist nämlich etwas Anderes, als das:
ausblenden C#-Quelltext
1:
var presence = new Anwesenheit.Presence();					


Das Zweite ist das, was du suchst, denn die hat auch die Methode Save().

Vielleicht wäre hier auch ein anderer Name angebracht, damit du nicht immer an die Namespaces vor der Klasse angewiesen bist. Das kann man machen, aber ich finde, wenn es sich vermeiden lässt, dann lieber vermeiden.



Zu dem was Ralf sagt (immer noch an traceurmicha):

Ralf hat vollkommen Recht mit dem, was er in Klammern schreibt.
Es gibt so eine Regel, die besagt, dass jede Klasse immer nur eine Aufgabe haben darf. (Nachzulesen unter Single-Responsibility-Prinzip)
Wenn du dann noch eindeutige und gut verständliche Namen vergibst, dann wird dir das bei größeren Projekten viel Zeit und Nerven ersparen.

Daten-Speicherung und Daten-Bereitstellung ist dabei ein Unterschied (je nach Umfang des Projektes, ein sehr Großer), das sind zwei verschiedene Aufgaben.
Da solltest du daher eine weitere Klasse speichern, die dazu zuständig ist, deine Presence-Objekte zu speichern.

Es ist auch nicht schlimm, wenn eine Klasse sehr kurz wird, solange sie ihre Aufgabe sinnvoll erfüllen kann.