Was ist der genaue Unterschied zwischen Kapselung und Abstraktion?
Antworten
Zu viele Anzeigen?Ich versuche hier eine Grenze zwischen Abstraktion und Kapselung zu ziehen. Meiner Meinung nach ist Abstraktion mehr eine konzeptionelle Sache, während Kapselung eine der Abstraktionsimplementierung ist. Da man Daten auch ohne Kapselung verstecken kann, z.B. mit privaten Konstanten oder Variablen, können wir also Verkapselung mit Data Hiding, aber Data Hiding ist nicht immer Verkapselung . Im folgenden Code versuche ich, die einfachste Form dieser Konzepte darzustellen.
// Abstraction
interface IOperation
{
int SquareNumber();
}
public class Operation
{
// Data hiding
private int number;
public Operation(int _number)
{
this.number = _number;
}
// Encapsulation
public int SquareNumber()
{
return number * number;
}
}
In Aktion,
IOperation obj = new Operation(2);
// obj.number <--- can't access because hidden from world using private access modifier but not encapsulated.
obj.SquareNumber(); // cannot access internal logic to calculate square because logic is hidden using encapsulation.
Lassen Sie mich dies mit einem einfachen Codebeispiel versuchen
Abstraktion = Datenverstecken + Kapselung
// Abstraction
interface IOperation
{
int GetSumOfNumbers();
}
internal class OperationEven : IOperation
{
// data hiding
private IEnumerable<int> numbers;
public OperationEven(IEnumerable<int> numbers)
{
this.numbers = numbers;
}
// Encapsulation
public int GetSumOfNumbers()
{
return this.numbers.Where(i => i % 2 == 0).Sum();
}
}
Abstraktion
Abstraktion ist der Prozess, bei dem die gemeinsamen Eigenschaften und Felder aller bestehenden und geplanten Implementierungen herausgezogen werden.
Zum Beispiel: Auto ist ein Recht für Limousine, Fließheck, SUV, Coupé, Cabrio. Auto hätte alle Eigenschaften und Felder, die allen Fahrzeugtypen gemeinsam sind.
Verkapselung
Verkapselung bedeutet, dass unerwünschte Details vor dem Benutzer verborgen werden. Dieser Begriff stammt von der Kapsel. Genauso wie Medikamente vor dem Benutzer in der Kapsel versteckt werden. Details von verschiedenen Maschinen und Ausrüstungen und Geräten, von Mixern, Fahrrädern, Waschmaschinen, Radios, Fernsehern bis hin zu Flugzeugen. Sie wollen nicht, dass alle Details der Maschine für den Benutzer sichtbar sind.
In Worten der Programmierung: Betrachten wir eine Klasse Car. Im folgenden Beispiel muss der Benutzer nur wissen, dass er den Schlüssel drehen muss (Methode turnKey()), die internen Funktionen sind ihm nicht bekannt. Der Benutzer muss nichts über die internen Funktionen oder über die internen Komponenten wissen.
In diesem Fall sind alle privaten Methoden interne Funktionen und private Felder wie "Piston p1" sind interne Daten, die der Benutzer nicht kennen muss.
public class Car{
private void startMotor(){ //do something }
private void generateVoltage(){ //do something }
private void sparkPlugIgnition(){ //do something }
private void fuelFlowFromTankToInjector(){ //do something }
private void pushPistonsDown() {
p1.doAction();
p2.doAction();
//do something }
private void moveCrankShaft(){ //do something }
private Piston p1;
private Piston p2;
public void turnKey(){
startMotor();
generateVoltage();
sparkPlugIgnition();
fuelFlowFromTankToInjector();
pushPistonsDown();
moveCrankShat();
...
}
}