这是我要解决的当前问题,我们在Kotlin中具有以下界面:
interface Parent<out Result, in Params> where Result : Any {
fun run(params: Params): Result
}
这里的问题是,有时我不想将任何参数传递给接口,因此我最终将Unit传递为类型参数,并且覆盖的类最终看起来像这样:
class Child : Parent<String, Unit> {
override fun run(params: Unit): String { ... }
}
最终目标:添加一些抽象以便在run
为Params
的情况下完全获取没有参数的Unit
函数是很不错的
喜欢:
class Child : Parent<SomeEntity, Unit> {
override fun run(): Entity { ... }
}
甚至更好的是,可以选择传递第二个类型参数,以使单个类具有一个或两个类型参数。
class Child : Parent<String> {
override fun run(): Entity { ... }
}
具有参数的同一父类
class Child : Parent<String, Int> {
override fun run(params: Int): String { ... }
}
这有可能吗?
答案 0 :(得分:2)
您可以创建一个扩展函数来处理Parent
,其中第二种类型是Unit。仅当第二种类型与单位匹配时,该功能才可用:
fun <Result> Parent<Result, Unit>.run() = run(Unit)
您使用的术语是非典型的。实现接口的类不是该接口的子级。它是任何超类的孩子。
答案 1 :(得分:1)
我认为您不能通过单个界面执行任何特殊操作。 ?♂️
我想到的一个解决方案是创建一个具有单个类型参数的子接口,该子接口将覆盖#include <stdio.h>
#include <Windows.h>
int main() {
LPCSTR dllpath = "C:\\Users\\......\\Dll1.dll";
printf("#### Starting ####\n");
printf("step 1: attaching the target process memory\n");
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
6456 // target process id
);
if (hProcess != NULL) {
printf("step 2: allocate the target memory process\n");
LPVOID dllPathMemoryAddr = VirtualAllocEx(
hProcess,
NULL,
strlen(dllpath),
MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE
);
if (dllPathMemoryAddr != NULL) {
printf("step 3: write to the process memory\n");
BOOL succeededWriting = WriteProcessMemory(
hProcess,
dllPathMemoryAddr,
dllpath,
strlen(dllpath),
NULL
);
if (succeededWriting) {
printf("step 4: execute.\n");
FARPROC loadLibAddr = GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")),
"LoadLibraryA"
);
HANDLE rThread = CreateRemoteThread(
hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE)loadLibAddr,
dllPathMemoryAddr,
0,
NULL
);
}
}
CloseHandle(hProcess);
}
return TRUE;
}
函数,该函数委托给另一个不带参数的函数。
像这样:
#### Starting ####
step 1: attaching the target process memory
step 2: allocate the target memory process
step 3: write to the process memory
step 4: execute.