Я новичок в 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
chengcj 8 Июн 2014 в 14:45

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 # не позволяет наследовать от двух классов. Это означает, что либо их базовый класс, либо ваш должен быть интерфейсом.

3
Wiktor Zychla 8 Июн 2014 в 11:10

Если вы не можете изменить третье лицо для наследования от Shape, то вы не сможете этого сделать. Вы также не можете наследовать от двух разных классов (см. Deadly Diamond of Death).

Если вы ДОЛЖНЫ сделать что-то похожее на это, попробуйте изменить Shape на интерфейс < / a> и создайте новый класс, который будет унаследован от Circle, а также будет реализовывать ваш интерфейс

0
Tzah Mama 8 Июн 2014 в 11:04