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.
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.)
Ein gutes Anwendungsbeispiel ist, wenn eine Seite der partiellen Klasse generiert wird (wie ein ORM)
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.
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.
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.
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.
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.
Tags und Links class c# abstract-class partial-classes