Ошибка "Graphics.pas(146) : Класс Circle не реализует метод MoveOn(IStyledGraphicsObject) интерфейса Engine_6.GraphicsObjects.IMovable"

Ошибка:

Graphics.pas(146) : Класс Circle не реализует метод MoveOn(IStyledGraphicsObject) интерфейса Engine_6.GraphicsObjects.IMovable

Вот архив: Engine 6.rar (420,3 КБ)

Вот описание класса Circle:

  /// Окружность.
  Circle = class(StyledGraphicsObject, ICircle, ICloneable)
  private
    [ContractInvariantMethod]
    procedure PropertiesValidation();
    
  public
    /// Радиус.
    auto property Radius: real;
    
    constructor(__vector2D: Vector2D; radius: real);
    
    /// Возвращает рендер объекта.
    function GetRender(): IRender; override;
    
    /// Клонирует объект.
    function Clone(): object; override;
  end;

А вот StyledGraphicsObject:

using Engine_6.Tools;
using System;
using System.Diagnostics.Contracts;

namespace Engine_6.GraphicsObjects
{
    /// <summary>
    /// Простой визуализируемый графический объект.
    /// </summary>
    public abstract class StyledGraphicsObject : IStyledGraphicsObject, ICloneable
    {
        [ContractInvariantMethod]
        protected virtual void PropertiesValidation() => Contract.Invariant(Style != null);

        /// <summary>
        /// Стиль объекта.
        /// </summary>
        public IStyle Style { get; set; }

        /// <summary>
        /// Задаёт центр объекта.
        /// </summary>
        public Vector2D Center { get; set; }

        public StyledGraphicsObject(Vector2D center) => Center = center;

        // Для языков, требующих конструктор по умолчанию.
        public StyledGraphicsObject() : this(Vector2D.Default)
        {
        }

        /// <summary>
        /// Возвращает рендер объекта.
        /// </summary>
        /// <returns>рендер.</returns>
        public abstract IRender GetRender();

        /// <summary>
        /// Перемещает объект на вектор.
        /// </summary>
        /// <param name="vector2D">Вектор смещения.</param>
        public void MoveOn(Vector2D vector2D) => Center = new Vector2D(Center.X + vector2D.X, Center.Y + vector2D.Y);

        /// <summary>
        /// Перемещает объект к другому объекту.
        /// </summary>
        /// <param name="vector2D">Объект-цель.</param>
        public void MoveOn(IStyledGraphicsObject styledGraphicsObject) => Center = styledGraphicsObject.Center; // <--

        /// <summary>
        /// Клонирует объект.
        /// </summary>
        /// <returns>Копия объекта.</returns>
        public abstract object Clone();
    }
}

А вот сам IMovable:

using Engine_6.Tools;

namespace Engine_6.GraphicsObjects
{
    /// <summary>
    /// Перемещаемый объект.
    /// </summary>
    public interface IMovable
    {
        /// <summary>
        /// Перемещает объект на вектор.
        /// </summary>
        /// <param name="vector2D">Вектор смещения.</param>
        void MoveOn(Vector2D vector2D);

        /// <summary>
        /// Перемещает объект к другому объекту.
        /// </summary>
        /// <param name="vector2D">Объект-цель.</param>
        void MoveOn(IStyledGraphicsObject styledGraphicsObject);
    }
}

Потомок должен реализовывать интерфейс сам.

Там вроде проблема в том что методы уже реализованы, но в абстрактном классе написанном на C#.

1 лайк

Нет, надо реализовывать в производном классе. Реализация интерфейса не наследуется

Как это не наследуется? С чего вы решили?

type
  i1 = interface
    procedure p1;
  end;
  
  t1 = class(i1)
    public procedure p1 := exit;
  end;
  
  t2 = class(t1) end;

begin
  new t2;
end.

А, да, перепутал