Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Do 31.12.09 19:16
Ich habe gerade ein kleines Verständnisproblem in Sachen Klassen und Funktionenauslagerung.
Bei meinem Konsolenprogramm habe ich damit kein Problem.
Ich habe:
Program.cs
Funktionen.cs
Benenne in Program.cs die "class Program" in "partial class Program" um und benenne die Klasse in Funktionen.cs von "class Funktionen" in "partial class Program".
Nun kanne ich ohne Codeänderung in meiner Program.cs auf die Funktionen in der Funktion.cs zugreifen.
Nun ist mein Verständnisproblem bei den Windows Forms Anwendung. Ich habe nun neben Program.cs und Funktionen.cs noch die Form1.cs und weiß nun nicht so recht, wie ich in Form1.cs auf die Funktionen in Funktionen.cs zugreifen kann ohne den internen Code der Form1.cs zu ändern, so wie ich es auch bei dem Konsolenprogramm erreicht habe.
MfG BlackMatrix
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 31.12.09 20:39
Hallo,
es gibt nur diese Möglichkeiten:
1. Aus class Funktionen wird partial class Form1. Aber dann sind die Funktionen nicht mehr Teil der Klasse Program.
2. Du brauchst eine Instanz der Klasse Funktionen; dann kannst du die Teile von Funktionen über diese Instanz benutzen.
3. Du deklarierst die Klasse Funktionen als static, oder die einzelnen Funktionen werden als static deklariert. Dann kannst du sie direkt über die Klasse Funktionen aufrufen. (Ob das sinnvoll und möglich ist, hängt vom Inhalt der Funktionen ab.)
Du solltest keinesfalls von Form1 aus auf Bestandteile der Klasse Program zugreifen. Deshalb geht es nicht, dass die Funktionen Teil von partial class Programm sind und du damit die Funktionen vom Form1 aus benutzt. Das ist "von Haus aus" unmöglich; es gibt Tricks, die aber fast immer ungeeignet sind.
Übrigens gehören Namen wie Label3 oder TextBox27 verboten. Du solltest Form1 sofort in MainForm o.ä. umbenennen. Siehe .NET Richtlinien für Namen.
Gruß und guten Rutsch! Jürgen
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 01.01.10 19:41
die 1. Möglichkeit war für mich auch die logischste und eigentlich auch die, die ich verwenden wollte, da ich nur in Form1.cs (um erstmal noch bei dem Namenbeispiel zu bleiben) die Funktionen brauche.
Jedoch habe ich mir mal nur eine Funktion auslagert, die in Form1.cs aufgerufen werden soll. Ich habe sie in Funktionen.cs geschrieben und habe die Klasse umbenannt von "class Funktionen" in "public partial class Form1 : Form".
Im Grunde genommen der selbe Klassenname wie die Form1.cs, jedoch meckert mein Compiler, dass meine Funktion, die ich in Form1.cs aufrufen möchte im aktuellen Kontext nicht vorhanden ist. (Program.cs ist als static class Programm deklariert, falls dies eine Bedeutung hat).
Wünsche dir auch ein gesundes Neues.
Zuletzt bearbeitet von BlackMatrix am Di 19.01.10 20:29, insgesamt 1-mal bearbeitet
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 01.01.10 20:05
Nein, das sieht nach einem anderen Fehler aus. Wenn die (bisherigen) Klassen Form1 und Program nichts voneinander wissen (abgesehen davon, dass Form1 durch Application.Run benutzt wird) und die (bisherige) Klasse Funktionen weder etwas von Form1 noch von Program weiß, dann ist es kein Problem, ihre Bestandteile durch "public partial class Form1" einzubinden. Wichtig ist, dass die Ableitung von Form nur ein einziges Mal erwähnt wird und der Namespace in allen Klassen übereinstimmt.
Du kannst dir Form1.Designer.cs genauer anschauen, um die Verknüpfung mehrerer partial-Teile zu erkennen.
Gruß Jürgen
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 01.01.10 20:36
JüTho hat folgendes geschrieben : | 3. Du deklarierst die Klasse Funktionen als static, oder die einzelnen Funktionen werden als static deklariert. Dann kannst du sie direkt über die Klasse Funktionen aufrufen. (Ob das sinnvoll und möglich ist, hängt vom Inhalt der Funktionen ab.) |
Auch wenn wir immer noch nicht mehr Informationen haben, würde ich trotzdem die Chance, dass hier static um Welten sinnvoller als partial ist, ziemlich hoch einschätzen. Ganz einfach weil partial in quasi jedem Fall vermieden kann und sollte  .
_________________ >λ=
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 01.01.10 20:54
Alles klar, ich habe mich mal mit einem neuen Projekt damit beschäftigt und nicht in meinem recht komplexen Beispiel herumprobiert.
Ich dürfe es im groben verstanden haben. Jedoch frage ich mich gerade, wieso partial vermieden werden sollte, denn bei Video2Brain wird das als eine Möglichkeit Methoden auszulagern, vorgeführt 
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 01.01.10 23:34
Es gibt den seltenen Fall, dass viele Member, die in mehrere Kategorien fallen, trotzdem in einer einzigen Klasse zusammengefasst werden müssen, System.Linq.Enumerable wäre imo (möglicherweise) so ein Kandidat. Abgesehen vom Erweitern Tool-generierter Klassen ist das der einzige sinnvolle Anwendungsfall von partial, den ich mir vorstellen kann. Bei deinem Problem gibt es aber sicherlich wesentlich bessere Designmöglichkeiten.
Kurz gesagt: de.wikipedia.org/wik...onsibility_Principle 
_________________ >λ=
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 01.01.10 23:48
Freut mich, dass ihr mir geholfen habt, in manch anderen C# Foren wird für das Fragen solcher Dinge fast rausgeworfen 
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Sa 02.01.10 12:05
BlackMatrix hat folgendes geschrieben : | ...in manch anderen C# Foren wird für das Fragen solcher Dinge fast rausgeworfen  |
Ich kenne vor allem ein Forum, in dem auf Anfängerfragen teilweise allergisch reagiert wird. Aber auch da kommt es auf die Art der Fragestellung an:
* Wenn der Fragesteller nur fragt und dabei klar wird, dass er sich noch nicht einmal die grundlegenden Kenntnisse angeeignet hat (z.B. Unterschiede zwischen Klassen und Instanzen), dann kann es passieren, dass er einfach abgefertigt wird.
* Wenn aber erkennbar wird, dass er sich Gedanken gemacht hat, wird ihm geholfen - egal ob sein Weg sinnvoll ist oder nicht.
Aber das nur am Rande. Gruß Jürgen
|
|