为什么我在实例化抽象 class 时出错?
Why do I get an error instantiating an abstract class?
我下载了一个名为 Process.NET
的 NuGet
包,我尝试在我的 main()
函数中使用 IMemory
接口中的 Read()
方法。我在 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('[=13=]') != -1)
ret = ret.Remove(ret.IndexOf('[=13=]'));
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] != '[=13=]')
stringToWrite += '[=13=]';
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
,请右键单击新的 class,然后单击实施。它为你写了很多东西!
您不能直接使用抽象 classes。您可以在创建从那些
派生的新 class 时使用它们
您不能实例化抽象 class。抽象 class 的目的是为派生 classes 提供一个公共接口。抽象 class 没有明确必要为任何方法提供实现(注意标记为 abstract
的方法缺少主体),因为期望子 classes 提供大部分的实施。阅读文档以查看哪个子项 class 最适合您的需求并对其进行实例化。
我不熟悉这个包,我也不清楚你想要实现什么,所以我真的不知道我能帮到你什么,但我可以告诉你:
不应实例化抽象 class。
您要么必须删除抽象关键字,要么创建自己的 class,实现抽象 class,如下所示:
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();
}
}
无论哪种情况,您都必须自己实现抽象函数。
希望这有帮助
您不能直接实例化抽象 class,您需要创建另一个 class 来实现它,并通过完成基础中标记为 abstract
的任何方法来提供完整的实现class。在你的情况下是:
byte[] Read(IntPtr intPtr, int length)
T Read<T>(IntPtr intPtr)
int Write(IntPtr intPtr, byte[] bytesToWrite)
void Write<T>(IntPtr intPtr, T value)
以下link可能会帮助您了解更多https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract。关于 classes,它指出:
The abstract
modifier indicates that the thing being modified has a
missing or incomplete implementation.
和
Members marked as abstract, or included in an abstract class, must be
implemented by classes that derive from the abstract class.
我下载了一个名为 Process.NET
的 NuGet
包,我尝试在我的 main()
函数中使用 IMemory
接口中的 Read()
方法。我在 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('[=13=]') != -1)
ret = ret.Remove(ret.IndexOf('[=13=]'));
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] != '[=13=]')
stringToWrite += '[=13=]';
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
,请右键单击新的 class,然后单击实施。它为你写了很多东西!
您不能直接使用抽象 classes。您可以在创建从那些
派生的新 class 时使用它们您不能实例化抽象 class。抽象 class 的目的是为派生 classes 提供一个公共接口。抽象 class 没有明确必要为任何方法提供实现(注意标记为 abstract
的方法缺少主体),因为期望子 classes 提供大部分的实施。阅读文档以查看哪个子项 class 最适合您的需求并对其进行实例化。
我不熟悉这个包,我也不清楚你想要实现什么,所以我真的不知道我能帮到你什么,但我可以告诉你:
不应实例化抽象 class。
您要么必须删除抽象关键字,要么创建自己的 class,实现抽象 class,如下所示:
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();
}
}
无论哪种情况,您都必须自己实现抽象函数。 希望这有帮助
您不能直接实例化抽象 class,您需要创建另一个 class 来实现它,并通过完成基础中标记为 abstract
的任何方法来提供完整的实现class。在你的情况下是:
byte[] Read(IntPtr intPtr, int length)
T Read<T>(IntPtr intPtr)
int Write(IntPtr intPtr, byte[] bytesToWrite)
void Write<T>(IntPtr intPtr, T value)
以下link可能会帮助您了解更多https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract。关于 classes,它指出:
The
abstract
modifier indicates that the thing being modified has a missing or incomplete implementation.
和
Members marked as abstract, or included in an abstract class, must be implemented by classes that derive from the abstract class.