为什么在实例化抽象类时出现错误?

时间:2019-04-16 20:38:18

标签: c# interface abstract-class implementation

我下载了一个名为NuGet的{​​{1}}程序包,然后尝试在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); } }

在观看上面的代码时有什么想法吗?

EDIT2 :下面的答案说明了您需要解决的所有问题。只是一点提示,如果您使用的是No argument was specified that corresponds to the formal handle parameter of ProcessMemory.ProcessMemory (SafeMemoryHandle).",请右键单击新类,然后单击工具。它为你写了很多东西!

4 个答案:

答案 0 :(得分:2)

我对软件包不熟悉,对我来说您还想实现什么不清楚,所以我真的不知道该如何帮助您,但是我可以告诉您:

不应实例化抽象类。

您将不得不删除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();
    }
}

在任何一种情况下,您都必须提出自己的抽象函数实现。 希望这会有所帮助

答案 1 :(得分:0)

您不能直接使用抽象类。您可以在创建从这些类派生的新类时使用它们

答案 2 :(得分:0)

您不能实例化一个抽象类。抽象类的目的是为派生类提供通用接口。抽象类不必明确为任何方法提供实现(注意,标记为abstract的方法缺少正文),因为期望子类提供大部分实现。阅读文档,了解哪种子类最适合您的需求并实例化。

答案 3 :(得分:0)

您不能直接实例化一个抽象类,您需要创建另一个实现该抽象类并通过完成基类中标记为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修饰符表示被修饰的事物具有一个   缺少或实施不完整。

  

标记为抽象或包含在抽象类中的成员必须是   由派生自抽象类的类实现。