Не найдено подходящего метода для сгенерированных переопределений - PullRequest
1 голос
/ 11 ноября 2019

Я работаю с Visual Studio и c # 8.0

РЕДАКТИРОВАТЬ, перейдите к редактированию ниже для лучшего кода

У меня есть некоторые базовые классы, определенные в библиотеке здесь:

using System.Collections.Generic;
using System.Threading;

namespace MeepTech.Jobs {
  public abstract class QueueManagerJob<QueueItemType> : ThreadedJob {
    protected List<QueueItemType> queue;
    protected Dictionary<QueueItemType, CancellationTokenSource> cancelationSources;

    protected QueueManagerJob(int maxChildJobsCount = 10);

    public void deQueue(QueueItemType[] queueObjects);
    public void enQueue(QueueItemType[] queueObjects);
    protected abstract QueueTaskChildJob getChildJob(QueueItemType queueObject, Dictionary<QueueItemType, CancellationTokenSource> parentCancelationSources);
    protected virtual bool isAValidQueueItem(QueueItemType queueItem);
    protected override void jobFunction();

    protected abstract class QueueTaskChildJob : ThreadedJob {
      protected QueueItemType queueItem;

      protected QueueTaskChildJob(QueueItemType queueItem, Dictionary<QueueItemType, CancellationTokenSource> parentCancellationSources);

      protected abstract void doWork(QueueItemType queueItem, CancellationToken cancellationToken);
      protected override void finallyDo();
      protected override void jobFunction();
    }
  }
}

Я пытаюсь расширить эти классы здесь:

 /// <summary>
    /// A base job for managing chunk work queues
    /// </summary>
    abstract class LevelQueueManagerJob : QueueManagerJob<Coordinate> {

      /// <summary>
      /// Base class for child jobs that manage chunk loading and unloading
      /// </summary>
      protected abstract class ChunkColumnLoadingJob : QueueTaskChildJob {

        /// <summary>
        /// The level we're loading for
        /// </summary>
        protected Level<BlockStorageType> level;

        /// <summary>
        /// Make a new job
        /// </summary>
        /// <param name="level"></param>
        /// <param name="chunkColumnLocation"></param>
        protected ChunkColumnLoadingJob(
          Level<BlockStorageType> level,
          Coordinate chunkColumnLocation,
          Dictionary<Coordinate, CancellationTokenSource> parentCancellationSources
        ) : base(chunkColumnLocation, parentCancellationSources) {
          this.level = level;
        }

        /// <summary>
        /// Do the actual work on the given chunk for this type of job
        /// </summary>
        protected abstract void doWorkOnChunk(Coordinate chunkLocation);

        /// <summary>
        /// Do work
        /// </summary>
        protected override void doWork(Coordinate chunkColumnLocation, CancellationToken cancellationToken) {
          Coordinate columnTop = (chunkColumnLocation.x, level.chunkBounds.y, chunkColumnLocation.z);
          Coordinate columnBottom = (chunkColumnLocation.x, 0, chunkColumnLocation.z);
          columnBottom.until(columnTop, chunkLocation => {
            if (!cancellationToken.IsCancellationRequested) {
              doWorkOnChunk(chunkLocation);
              return true;
            }

            return false;
          });
        }
      }

      /// <summary>
      /// The level we're loading for
      /// </summary>
      protected Level<BlockStorageType> level;

      /// <summary>
      /// Create a new job, linked to the level
      /// </summary>
      /// <param name="level"></param>
      protected LevelQueueManagerJob(Level<BlockStorageType> level) : base(MaxChunkLoadingJobsCount) {
        this.level = level;
      }
    }
  }

, прежде чем я превратил вышеупомянутый класс в библиотеку, он работал как предназначено, однако теперь я получаю сообщение об ошибке для классов, которыепотомки ChunkColumnLoadingJob:

Ошибка CS0534 'ColumnLoadedLevel<BlockStorageType>.JUnloadChunks.JUnloadChunkColumn' не реализует унаследованный абстрактный член 'QueueManagerJob<Coordinate>.QueueTaskChildJob.doWork(Coordinate, CancellationToken)' VoxelTerrainA2 C: \ Users \ super \ Projects \ MonoGame \ VoxelTerrainA2 \ Evix \ Voxel \ Collections \ ColumnLoadedLevel.cs 281

, хотя он там. Я также могу использовать Visual Studio для автоматического создания функции переопределения для отсутствующей функции, что дает мне следующее:


protected override void doWork(Coordinate queueItem, CancellationToken cancellationToken) {
          throw new NotImplementedException();
        }

, которое фактически выдает ту же самую ошибку, что и другая функция:

ColumnLoadedLevel<BlockStorageType>.LevelQueueManagerJob.ChunkColumnLoadingJob.doWork(Coordinate, CancellationToken): не найден подходящий метод для переопределения

Не могу понять, что я делаю неправильно, у кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ:

Удаление кода, чтобы было легче увидеть проблему:

Файл моей библиотеки:

namespace MeepTech.Jobs {
  public abstract class TestChildQueueJob<QueueItemType> : ThreadedJob {
    protected TestChildQueueJob();

    protected abstract void doWork(QueueItemType queueItem, CancellationToken cancellationToken);
  }
}

Версия CS:


  /// <summary>
  /// Child job for doing work on objects in the queue
  /// </summary>
  public abstract class TestChildQueueJob<QueueItemType> {

    /// <summary>
    /// The do work function
    /// </summary>
    /// <param name="queueItem"></param>
    /// <param name="cancellationToken"></param>
    protected abstract void doWork(QueueItemType queueItem, CancellationToken cancellationToken);
  }
}

Новый код:

class testjob : QueueTaskChildJob<Coordinate> {
  protected override void doWork(Coordinate queueItem, CancellationToken cancellationToken) {
    throw new NotImplementedException();
  }
}

class testjob выдает ошибку:

Код серьезности Описание Ошибка состояния подавления строки файла проекта CS0534 «testjob» не реализует унаследованный абстрактный член QueueTaskChildJob<Coordinate>.doWork(Coordinate,CancellationToken) VoxelTerrainA2 C:\ Users \ super \ Projects \ MonoGame \ VoxelTerrainA2 \ Evix \ Voxel \ Collections \ testjob.cs 10 Актив

и testjob.doWork имеет ошибку:

Код серьезностиОписание Файл проекта Ошибка состояния подавления строки файлаCS0115 testjob.doWork(Coordinate, CancellationToken): не найден подходящий метод для переопределения VoxelTerrainA2 C: \ Users \ super \ Projects \ MonoGame \ VoxelTerrainA2 \ Evix \ Voxel \ Collections \ testjob.cs 11 Актив

Следует отметить, чтоэто работает:

namespace MeepTech.Jobs {

  /// <summary>
  /// Child job for doing work on objects in the queue
  /// </summary>
  public abstract class TestChildQueueJob<QueueItemType> {

    /// <summary>
    /// The do work function
    /// </summary>
    /// <param name="queueItem"></param>
    /// <param name="cancellationToken"></param>
    protected abstract void doWork(QueueItemType queueItem, CancellationToken cancellationToken);
  }

  class testjob : TestChildQueueJob<int> {

    protected override void doWork(int queueItem, CancellationToken cancellationToken) {
      throw new NotImplementedException();
    }
  }
}

Это не работает, только когда базовые классы загружаются через файл DLL (то есть библиотеку), а сами файлы .cs не включены.

...