Я работаю с 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 не включены.