Ich brauche hier eine kleine Musterrichtung. Neu in C#.Gemeinsame Schnittstelle für zwei Drittanbieter-Klassen, die ich nicht kontrolliere. Externer Polymorphismus?
Ich arbeite mit einem Devipaket von Drittanbietern, das einen Webdienst umschließt. Es gibt zwei spezifische Klassen, mit denen ich mich befasse, die zwar relativ ähnlich sind, sich aber in zwei verschiedenen Namespaces im DevKit befinden, und es gibt keine gemeinsame Basisklasse. Ich möchte jedoch beide gegen eine gemeinsame Schnittstelle programmieren. Ich habe willkürlich eine Implementierung zusammengeschustert, die den Wrapper im Wesentlichen umhüllt, aber ich bin ziemlich sicher, dass es nicht die effizienteste Methode aufgrund des unaufhörlichen Castings ist.
Ich habe durch Artikel über Adapter, Schnittstellen, Erweiterungsmethoden usw. gegraben. Aber ich habe wenig Zeit, also wenn ich einen Schub in eine Richtung bekommen könnte, würde das sehr geschätzt werden.
using ThirdParty.TypeA.Employee;
using ThirdParty.TypeB.Employee;
public class Employee
{
private object genericEmployee;
private EmployeeType empType;
public enum EmployeeType
{
TypeA = 0;
TypeB = 1;
}
public Employee(Object employee, EmployeeType type)
{
genericEmployee = employee;
empType = type;
}
public String Name
{
if (empType == EmployeeType.TypeA)
return (ThirdParty.TypeA.Employee)genericEmployee.Name;
else
return (ThirdParty.TypeB.Employee)genericEmployee.Name;
}
public String Age
{
if (empType == EmployeeType.TypeA)
return (ThirdParty.TypeA.Employee)genericEmployee.Age;
else
return (ThirdParty.TypeB.Employee)genericEmployee.Age;
}
}
Rev 2:
class EmployeeTypeAAdapter : TypeA, IEmployeeAdapter
{
TypeA _employee;
public EmployeeTypeAAdapter(TypeA employee)
{
_employee = employee
}
public String Name
{
get { return _employee.Name; }
set { _employee.Name = value; }
}
public String Balance
{
get
{
if (_employee.Balance != null)
{
decimal c = _employee.Balance.Amount;
return String.Format("{0:C}", c);
}
else
{
return "";
}
}
}
//...
}
class EmployeeTypeBAdapter : TypeB, IEmployeeAdapter
{
TypeB _employee;
public EmployeeTypeAAdapter(TypeB employee)
{
_employee = employee
}
public String Name
{
get { return _employee.Name; }
set { _employee.Name = value; }
}
public String Balance
{
get
{
if (_employee.Balance != null)
{
decimal c = _employee.Balance.Amount;
return String.Format("{0:C}", c);
}
else
{
return "";
}
}
}
//....
}
Sind TypA und TypB öffentlich und bekannt, ich meine, müssen Sie Enum wirklich einführen? Du könntest einen generischen Weg gehen. – abatishchev
Was sind die Typen von TypeA und TypeB, wie werden die Klassen deklariert? Nur gleiche Menge von Eigenschaften und keine Basisklasse? Sie können sie also nur durch "Objekt" verallgemeinern? – abatishchev
Es gibt keine Basisklasse in der Third-Party-Bibliothek. Die Enumeration war nur eine Convenience-Eigenschaft, die ich erstellt habe, um zu vermeiden, dass TypeOf oder IS verwendet werden muss, um den Objekttyp (TypeA oder TypeB) bei jedem Zugriff auf eine Eigenschaft zu bestimmen. – RyanMac