Почему я получаю ошибку при создании абстрактного класса? - PullRequest
0 голосов
/ 16 апреля 2019

Я загрузил пакет NuGet с именем Process.NET и пытаюсь использовать метод Read() из интерфейса IMemory в моей функции main(). Я реализовал это, как в учебнике GIT, но я не могу создать экземпляр ProcessMemory, например:

ProcessMemory memory = new ProcessMemory();

Я получаю эту ошибку:

"Unable to create instance of the abstract class or interface 'ProcessMemory'. "

Я нашел некоторые темы об этом, но ничто не могло мне помочь. Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Process.NET.Memory;
using Process.NET.Native.Types;

namespace MemoryHacker
{
    class Program
    {
        static void Main(string[] args)
        {

            ProcessMemory memory = new ProcessMemory();

        }
    }

    //Class with Read() function
    public abstract class ProcessMemory : IMemory
    {
        protected readonly SafeMemoryHandle Handle;

        protected ProcessMemory(SafeMemoryHandle handle)
        {
            Handle = handle;
        }

        public abstract byte[] Read(IntPtr intPtr, int length);

        public string Read(IntPtr intPtr, Encoding encoding, int maxLength)
        {
            var buffer = Read(intPtr, maxLength);
            var ret = encoding.GetString(buffer);
            if (ret.IndexOf('\0') != -1)
                ret = ret.Remove(ret.IndexOf('\0'));
            return ret;
        }

        public abstract T Read<T>(IntPtr intPtr);

        public T[] Read<T>(IntPtr intPtr, int length)
        {
            var buffer = new T[length];
            for (var i = 0; i < buffer.Length; i++)
                buffer[i] = Read<T>(intPtr);
            return buffer;
        }

        public abstract int Write(IntPtr intPtr, byte[] bytesToWrite);

        public void Write(IntPtr intPtr, string stringToWrite, Encoding encoding)
        {
            if (stringToWrite[stringToWrite.Length - 1] != '\0')
                stringToWrite += '\0';
            var bytes = encoding.GetBytes(stringToWrite);
            Write(intPtr, bytes);
        }


        public void Write<T>(IntPtr intPtr, T[] values)
        {
            foreach (var value in values)
                Write(intPtr, value);
        }

        public abstract void Write<T>(IntPtr intPtr, T value);
    }

}

РЕДАКТИРОВАТЬ: Хорошо, вещь с экземпляром теперь ясно. Но я все еще получаю сообщение об ошибке:

"No argument was specified that corresponds to the formal handle parameter of ProcessMemory.ProcessMemory (SafeMemoryHandle)."

есть идеи, пока смотрите код выше?

EDIT2: Все, что вам нужно для решения этой проблемы, сказано в ответах ниже. Небольшая подсказка: если вы используете Visual Studio, щелкните правой кнопкой мыши новый класс и щелкните на кнопке реализации. Он пишет много вещей для тебя!

Ответы [ 4 ]

2 голосов
/ 16 апреля 2019

Я не знаком с пакетом, и мне не ясно, чего вы пытаетесь достичь, поэтому я не знаю, как вам помочь, но я могу сказать вам следующее:

Не рекомендуется создавать экземпляр абстрактного класса.

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

public class MyProcessMemory : ProcessMemory
{
    public override byte[] Read(IntPtr intPtr, int length)
    {
        throw new NotImplementedException();
    }

    public override T Read<T>(IntPtr intPtr)
    {
        throw new NotImplementedException();
    }

    public override int Write(IntPtr intPtr, byte[] bytesToWrite)
    {
        throw new NotImplementedException();
    }

    public override void Write<T>(IntPtr intPtr, T value)
    {
        throw new NotImplementedException();
    }
}

В любом случае вам придётся придумать собственную реализацию абстрактных функций.Надеюсь, это поможет

0 голосов
/ 17 апреля 2019

Вы не можете создать экземпляр абстрактного класса напрямую, вам нужно создать другой класс, который реализует его и обеспечивает полную реализацию, завершая любые методы, помеченные как abstract в базовом классе.В вашем случае это:

byte[] Read(IntPtr intPtr, int length)

T Read<T>(IntPtr intPtr)

int Write(IntPtr intPtr, byte[] bytesToWrite)

void Write<T>(IntPtr intPtr, T value)

Следующая ссылка может помочь вам понять больше https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract. Относится к классам, в которых говорится:

abstract Модификатор указывает, что изменяемая вещь имеет отсутствующую или неполную реализацию.

и

Члены, помеченные как абстрактные или включенные в абстрактный класс, должны быть реализованы с помощьюклассы, производные от абстрактного класса.

0 голосов
/ 16 апреля 2019

Вы не можете создать экземпляр абстрактного класса.Цель абстрактного класса - предоставить общий интерфейс для создания классов.Для абстрактного класса не обязательно явно предоставлять реализацию для любого метода (обратите внимание на отсутствие тела для методов, помеченных abstract), поскольку ожидается, что дочерние классы обеспечивают основную часть реализации.Прочтите документацию, чтобы узнать, какой дочерний класс лучше всего подходит для ваших нужд, и создайте его экземпляр.

0 голосов
/ 16 апреля 2019

Вы не можете использовать абстрактные классы напрямую.Вы можете использовать их при создании нового класса, производного от этих

...