C# - импортировать класс из сторонней библиотеки и сделать его производным классом (или чем-то похожим)
Я новичок в C#. Я хотел бы импортировать класс из сторонней библиотеки и сделать его производным классом (или чем-то похожим). В следующем примере, как я могу создать класс, который может иметь как CircleSpecificMethods() и CommonShapeMethods()?
Спасибо!
Сторонняя библиотека:
namespace ThirdPartyLib
{
public class Circle
{
public CircleSpecificMethods()
{
...
}
}
public class Triangle
{
public TriangleSpecificMethods()
{
...
}
}
}
Моя программа:
using ThirdPartyLib;
namespace MyProgram
{
public class Shape
{
public CommonShapeMethods()
{
...
}
}
public class Rectangle : Shape
{
public RectangleSpecificMethods()
{
...
}
}
public static class Program
{
public static void Main()
{
var rectangle = new Rectangle();
var circle = new Circle();
rectangle.CommonShapeMethods();
rectangle.RectangleSpecificMethods();
circle.CommonShapeMethods(); // How can I make circle to have CommonShapeMethods as well?
circle.CircleSpecificMethods();
}
}
}
2 ответа
То, что вы просите, это шаблон адаптера.
Адаптер - это вспомогательный класс, который позволяет адаптировать класс в другой класс. В вашем примере это будет
// adapter fulfills your requirement, it is a shape
public class CircleToShapeAdapter : Shape
{
private Circle _circle { get; set; }
// but it takes their object as a source
public CircleToShapeAdapter( Circle circle )
{
this._circle = circle;
}
// for any method that is required by your Shape specification
// you just find a way to implement the method using their API
public void ShapeMethod()
{
circle.DoSomething();
}
}
и тогда вы можете иметь свои фигуры, используя их круги
Shape shape = new CircleToShapeAdapter( circle );
Обратите внимание, что адаптер все еще может предоставлять методы, специфичные для круга, но он не будет действовать как круг (не наследует от него), так как C# не позволяет вам наследовать от двух классов. Это означает, что их базовый класс или ваш должен быть интерфейсом.
Если вы не можете изменить свою третью сторону для наследования от Shape
тогда ты не сможешь это сделать. Вы также не можете наследовать от 2 разных классов (см. Смертельный алмаз смерти).
Если вы ДОЛЖНЫ сделать что-то близкое к этому, попробуйте изменить Shape
к интерфейсу и создать новый класс, который будет наследоваться от Circle
а также будет реализовывать ваш интерфейс