hab etwas Mühe mit dem Compilerfehler CS0176. Warum kann ich über eine
Instanz nicht auf einen statischen Member zugreifen? Statische Member
sind doch einfach Member, die für alle Instanzen gleich sind, also
sollte man doch auch über ein Instanzenverweis darauf zugreifen
können??
folgendes Problem:
abstract class myBaseClass
{
public static int myStaticField;
}
class myClass1 : myBaseClass
{
public static new int myStaticField = 5;
}
class myClass2 : myBaseClass
{
public static new int myStaticField = 10;
}
//irgendwo folgende Methode
public void myMethod (myBaseClass myObj)
{
int x = myObj.myStaticField; //CS0176
}
//irgendwo folgender Methodenaufruf
myMethod(new myClass1);
ich muss in der Methode myMethod auf das statische Feld myStaticField
zugreifen... die Klasse von myObj weiss ich jedoch nicht, da nicht ein
Objekt vom Typ myBaseClass übergeben wird, sondern eines vom Typ einer
von ihr abgeleiteten Klasse, myClass1 oder myClass2... darum kann ich
nicht schreiben
int x = myBaseClass.myStaticField;
danke für eure Hilfe
gruss Jonas
bei der deklaration eines static-member wird dieser member nicht nur auf
eine spezifische Klasseninstanz (Objekt), sondern auf die gesamte Klasse
angewendet. Der Zugriff ist nur über den Klassennamen selbst möglich. Bei
der Erstellung einer Instanz werden static Mitglieder nicht
mitberücksichtigt. Wofür benötigst du das ?
Gruß
Frank
"Jonas Sourlier" <evil_...@gmx.ch> schrieb im Newsbeitrag
news:oqkhmv08sp80nrp8c...@4ax.com...
> bei der deklaration eines static-member wird dieser member nicht auf
> eine spezifische Klasseninstanz (Objekt), sondern auf die gesamte Klasse
> angewendet.
"Frank Seyfried" <fran...@web.de> schrieb im Newsbeitrag
news:eDSFIfWf...@tk2msftngp13.phx.gbl...
"Frank Seyfried" <fran...@web.de> schrieb:
> bei der deklaration eines static-member wird dieser member
> nicht nur auf eine spezifische Klasseninstanz (Objekt), sondern
> auf die gesamte Klasse angewendet. Der Zugriff ist nur über den
> Klassennamen selbst möglich. Bei der Erstellung einer Instanz
> werden static Mitglieder nicht mitberücksichtigt.
Tja, das ist IMO einfach eine lästige Einschränkung von C#. In VB.NET haben
wir das Problem gottseidank nicht:
\\\
Dim b As New Bla()
b.Foo()
.
.
.
Public Class Bla
Public Shared Sub Foo()
MsgBox("Baz")
End Sub
End Class
///
> Wofür benötigst du das ?
LOL... wenn es immer nur darum gehen würde...
--
Herfried K. Wagner
MVP · VB Classic, VB.NET
http://www.mvps.org/dotnet
//irgendwo folgende Methode
public void myMethod (myBaseClass myObj)
{
int x = myBaseClass.myStaticField; //CS0176
} /\/\/\/\/\/\/\/\/\/\
mfg GP
"Jonas Sourlier" <evil_...@gmx.ch> wrote in message
news:oqkhmv08sp80nrp8c...@4ax.com...
Das ist korrekt, es handelt sich nur um eine Einschränkung in C#, In VB, C++
etc. funktioniert das.
Es liegt aber nicht daran, das static bei Instanzen nicht berücksichtigt
würden, sondern ist wie gesagt eine Sprachlimitierung,
die aber nur Klarheit bringt und keine Nachteile, zumindest sehe ich die
nicht.
Habt Ihr ev. ein Praxisbeispiel, wo ich anstatt Klasse.methode() besser
Objekt.Methode() aufrufen sollte,
wenn es sich in beiden Fällen um ein static handelt ?
ich glaub ich wechsle schleunigst zu VB.NET das kann ja nicht sein. Was
haben sich die Herren aus der C# Abteilung gedacht ;)
Gruß
Frank
"Herfried K. Wagner [MVP]" <hirf...@m.activevb.de> schrieb im Newsbeitrag
news:us5d9sWf...@tk2msftngp13.phx.gbl...
die frage die ich mir jetzt stelle ist, ob ein Klassenmember im VB.NET im
Konstruktor initialisiert werden kann. Normalerweise sollte das doch nicht
gehen, oder irre ich mich, da es ja ein Klassenmember ist, und kein Member
einer Instanz?
Gruß
Frank
"Roger Boesch" <roger....@multihull.ch> schrieb im Newsbeitrag
news:3f694c4e$1...@news.bluewin.ch...
was ist aber wenn du zugriff auf die static members einer bestimmten
abgeleiteten klasse benötigst.dort müsstes du für jede klasse diese methode
implementieren, oder ?
gruß
frank
"Günter Prossliner" <g.pros...@gmx.at> schrieb im Newsbeitrag
news:eHIjxWaf...@TK2MSFTNGP11.phx.gbl...
mfg GP
"Frank Seyfried" <fran...@web.de> wrote in message
news:u5gDV6cf...@TK2MSFTNGP11.phx.gbl...
"Frank Seyfried" <fran...@web.de> schrieb:
> ich glaub ich wechsle schleunigst zu VB.NET das kann
> ja nicht sein. Was haben sich die Herren aus der C#
> Abteilung gedacht ;)
;-)
"Frank Seyfried" <fran...@web.de> schrieb:
> die frage die ich mir jetzt stelle ist, ob ein Klassenmember
> im VB.NET im Konstruktor initialisiert werden kann.
> Normalerweise sollte das doch nicht gehen, oder irre ich
> mich, da es ja ein Klassenmember ist, und kein Member
> einer Instanz?
Was?
\\\
Public Class Bla
Public Shared Foo As Integer
Public Moo As Integer
Public Sub New()
Moo = 22
End Sub
Shared Sub New()
Foo = 99
End Sub
End Class
///
Oder was meinst du?
Public Class Bla
Public Shared Foo As Integer 'static
Public Moo As Integer
'Konstuktor
Public Sub Bla()
Moo = 22
Foo = 3 <--- geht das ?
End Sub
End Class
gruß
frank
"Herfried K. Wagner [MVP]" <hirf...@m.activevb.de> schrieb im Newsbeitrag
news:e1v##OdfDH...@TK2MSFTNGP11.phx.gbl...
"Frank Seyfried" <fran...@web.de> schrieb:
> ich meinte sowas in der art ;)
>
> Public Class Bla
>
> Public Shared Foo As Integer 'static
> Public Moo As Integer
>
> 'Konstuktor
> Public Sub Bla()
> Moo = 22
> Foo = 3 <--- geht das ?
> End Sub
>
> End Class
Ja, natürlich funktioniert das. Aus einem Instanzmember kann man natürlich
auch auf die Shared-Member zugreifen (die ja allen Instanzen gemeinsam
sind).
ich verstehe Eure Probleme nicht. Ganz im Gegenteil, ich bin froh, dass man
in C# eine statische Methode nur über den Klassenname aufrufen kann. Die
VB-Variante, die ja aus C++ Zeiten stammt, ist nur verwirrend und bringt
keine Vorteile. In C# sieht man ganz genau an der Art des Methodenaufrufs,
ob die Methode statisch ist oder nicht. Bei VB sieht man das nicht, wenn der
Programmierer diese (unsinnige) Variante verwendet und die Methode über eine
Referenzvariable aufruft.
Gruß
Joachim
danke für deine Antwort
>bei der deklaration eines static-member wird dieser member nicht nur auf
>eine spezifische Klasseninstanz (Objekt), sondern auf die gesamte Klasse
>angewendet. Der Zugriff ist nur über den Klassennamen selbst möglich. Bei
>der Erstellung einer Instanz werden static Mitglieder nicht
>mitberücksichtigt. Wofür benötigst du das ?
hab ich doch eben beschrieben... ich bekomme in einer Methode ein
Objekt als Parameter... ich weiss seine Klasse aber nicht, da die
Klasse, die in der Parameterbeschreibung angegeben ist, nur die
Basisklasse ist von allen Klassen, die eventuell übergeben werden...
aber wäre nett, wenn ihr euch das Problem etwas genauer anschaut:
>>
>>
>> abstract class myBaseClass
>> {
>> public static int myStaticField;
>> }
>> class myClass1 : myBaseClass
>> {
>> public static new int myStaticField = 5;
>> }
>> class myClass2 : myBaseClass
>> {
>> public static new int myStaticField = 10;
>> }
>>
>> //irgendwo folgende Methode
>>
>> public void myMethod (myBaseClass myObj)
>> {
>> int x = myObj.myStaticField; //CS0176
>> }
>>
>> //irgendwo folgender Methodenaufruf
>>
>> myMethod(new myClass1);
>>
>>
>> ich muss in der Methode myMethod auf das statische Feld myStaticField
>> zugreifen... die Klasse von myObj weiss ich jedoch nicht, da nicht ein
>> Objekt vom Typ myBaseClass übergeben wird, sondern eines vom Typ einer
>> von ihr abgeleiteten Klasse, myClass1 oder myClass2... darum kann ich
>> nicht schreiben
>>
>> int x = myBaseClass.myStaticField;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ geht eben nicht, da ich nicht den
Wert von myBaseClass.myStaticField wissen will, sondern den von
myClass1.myStaticField (sofern ein Objekt von myClass1 übergeben
worden ist....)
versteht jetzt jemand mein Problem?
vielen Dank
mit "Wöfür benötigst du das" meinte ich, warum der Klassenmember static sein
muss, und für welches Anwendungsgebiet du das brauchst. Wenn du nur den wert
myClass1.myStaticField wissen willst, kann das doch ein normaler Member
verwenden, der evtl. im Konstruktor der Klasse einmalig initialisiert wird.
Da du ein Objekt der MyMethod übergibst, wurde diese ja irgendwann
konstruriert,
sodass die Initialisierung stattgefunden hat.
Wenn der Wert klassenübergreifen gehalten werden muss, kann du auch das
Objekt
selbst static deklarieren.
Ich verwende derzeit nur static Members ,wenn ich kein eigenes Objekt bauen
will oder werte klassenübergreifen halten will.
Gruß
Frank
genau das möchte ich... den Wert klassenübergreifend halten... und
anscheinend gibt's keine Möglichkeit, darauf mit einem
Instanzenverweis zuzugreifen
trotzdem danke
gruss Jonas