Welche Vorteile bietet die Verwendung einer partiellen Klasse im Gegensatz zu einer abstrakten Klasse?

7

Ich habe das Programmieren von Microsoft® Visual C # ® 2008: Die Sprache gelesen, um C # besser zu verstehen und was damit gemacht werden kann. Ich stieß auf Teilklassen, die ich bereits aus der ASP.Net-Klasse kennen gelernt hatte.

Mir scheint, dass Sie tun können, was partielle Klassen mit einer abstrakten und einer überschriebenen Klasse tun. Offensichtlich wird ein Team die Schnittstelle über die abstrakten Methoden kontrollieren, aber Sie würden sich trotzdem aufeinander verlassen. Und wenn das Ziel die Zusammenarbeit ist, dann ist es nicht das, was die Quellcodeverwaltung und andere Tools lösen.

Ich verpasse gerade den Punkt einer partiellen Klasse. Auch könnte jemand eine reale Welt verwenden.

    
uriDium 29.06.2009, 11:37
quelle

8 Antworten

18

Partielle Klassen haben nichts mit der Vererbung von Objekten zu tun. Teilklassen sind nur eine Möglichkeit, den Quellcode, der eine Klasse definiert, in separate Dateien aufzuteilen (dies geschieht beispielsweise, wenn Sie in Ihrer Windows Forms-Anwendung ein neues Formular erstellen - eine Datei ist "Ihr" Code, eine andere Datei .designer.cs) enthält den Code, den VS2008 für Sie verwaltet.)

    
Thorsten Dittmar 29.06.2009, 11:40
quelle
4

Ein gutes Anwendungsbeispiel ist, wenn eine Seite der partiellen Klasse generiert wird (wie ein ORM)

    
Mitch Wheat 29.06.2009 11:40
quelle
4

Das Tolle an einer Teilklasse ist, dass Sie eine vorhandene Klasse übernehmen und hinzufügen können. Das hört sich nun nach Vererbung an, aber es gibt viele Dinge, die die Vererbung nicht so tun kann, wie es Teilklassen tun.

Hier ist eine Frage zu den Linq to SQL-Klassen, die für Sie erstellt wurden. Sie werden automatisch generiert, dh Sie sollten sie nicht ändern. Ohne eine partielle Klasse können Sie keine Schnittstelle anhängen. Sie könnten eine neue Klasse erstellen und diese von der Linq-Klasse zur SQL-Klasse ableiten, aber das bringt Ihnen wirklich nichts, weil Sie die linq-Klasse in der Klasse mit der Schnittstelle nicht upgraden können.

    
kemiller2002 29.06.2009 11:46
quelle
2

Teilklassen sollten auf die Verwendung von automatisch generiertem Code beschränkt sein, wobei der andere Code nicht geändert werden kann. Die Verwendung als Ersatz für Vererbung oder das Hinzufügen von Funktionen sind keine bewährten Verfahren.

Wenn Sie eine große Klasse haben, ist es schon falsch. Code sollte in mehrere "echte" Klassen anstelle von mehreren Dateien refaktoriert werden. Große Klassen bedeuten im Allgemeinen, dass die Klasse zu viele Dinge tut und SRP (Single Responsibility Principle) verletzt.

    
vasya10 07.04.2011 16:03
quelle
1

Partielle Klassen werden jetzt in ASP.Net stark verwendet, um zwei Quelldateien die Markup-basierte example.aspx und die code-basierte example.aspx.cs so zu ermöglichen, dass die jeweils definierten Methoden und Variablen für jede Quelldatei sichtbar sind. im Beispiel.aspx

%Vor%

in der example.aspx.cs

%Vor%

Die bidirektionale Natur davon kann nicht mit abstrakten Klassen neu erstellt werden.

    
David Waters 29.06.2009 12:39
quelle
1

Es klingt wie Ihre Frage ist, was der Unterschied zwischen

ist %Vor%

und

%Vor%

Obwohl sie etwas ähnlich erscheinen mögen, und in einigen Fällen könnte das letztere Konstrukt anstelle des ersteren verwendet werden, gibt es mindestens zwei Probleme mit dem letzteren Stil:

-1- Der Typ FooBase müsste wahrscheinlich die Identität des konkreten Typs kennen, der sich daraus ableiten sollte, und verwendet immer Variablen dieses Typs und nicht den Typ FooBase . Das ist eine unangenehm enge Verbindung zwischen den beiden Typen.

-2- Wenn der Typ Foo öffentlich ist, muss FooBase ebenfalls public sein. Selbst wenn alle Konstruktoren von FooBase internal sind, wäre es für externen Code möglich, Klassen zu definieren, die von FooBase , aber nicht von Foo abgeleitet sind; solche Instanzen zu konstruieren wäre schwierig, aber nicht unmöglich.

Wenn es für einen abgeleiteten Typ möglich wäre, die Sichtbarkeit eines Basistyps zu erweitern, wären diese Probleme nicht allzu problematisch. man würde FooBase als "wegwerfbaren" Bezeichner ansehen, der genau zweimal erscheinen würde: einmal in seiner Deklaration und einmal in der Deklarationszeile für Foo , und bedenke, dass jeder FooBase ein Foo verkleidet wäre. Die Tatsache, dass FooBase die Instanzelemente Foo in this ohne eine Typumwandlung nicht verwenden konnte, könnte lästig sein, könnte aber auch eine gute Partitionierung von Code fördern. Da es jedoch nicht möglich ist, die Sichtbarkeit eines Basistyps zu erweitern, erscheint das Design der abstrakten Klasse eklig.

    
supercat 16.06.2013 20:59
quelle
0

Zweck von partiellen Klassen ist es, die Definition einer Klasse auf mehrere Dateien zu verteilen. Dies kann eine bessere Wartbarkeit und Trennung Ihres Codes ermöglichen.

    
Perica Zivkovic 29.06.2009 11:41
quelle
0

Wir verwenden Teilklassen, um unsere größeren Klassen aufzuteilen. Auf diese Weise ist es einfacher, einen Teil des Codes mit Sourcesafe zu überprüfen. Dies begrenzt die Fälle, in denen vier Entwickler auf dieselbe Datei zugreifen müssen.

    
Carra 29.06.2009 11:44
quelle