我正在尝试为实现接口Iinterface
的所有类创建扩展方法,该接口将返回T
的列表,其中T
是原始类。所以基本上是这样的:
public static List<T> Funct<T>(this T obj)
where T : Iinterface, new()
然而,这适用于每个对象,而不仅仅适用于Iinterface
类。所以,我正在尝试制作类似this Iinterface obj
的内容,这样可行但只有当我将其用作myObj.Funct<MyObjType>()
时我才能直接将其用作List<MyObjType> list = myObj.Funct()
,而不是Iinterface
。我有什么方法可以使用扩展名吗?
我正在考虑使用效用函数或扩展interface IExtend<T> : Iinterface
where T : IExtend<T> {}
来创建这样的东西:
public static List<T> Funct<T>(this IExtend<T> obj)
where T : IExtend<T> {}
然后我可以制作这样的扩展函数:
Iinterface
然而,在我这样做之前,有没有办法可以直接将函数实现到public interface Iinterface { }
public interface Iinterface2 { }
public class MyObjType : Iinterface { }
public class SomeOtherClass : Iinterface2 { }
public static class Mine {
public static List<T> Funct<T>(this T obj)
where T : Iinterface, new() => null;
public static void Funct(this Iinterface2 obj)
{ }
public static void Main()
{
MyObjType obj = new MyObjType();
List<MyObjType> list = obj.Funct(); // the above mentioned function works in this case
SomeOtherClass obj2 = new SomeOtherClass();
obj2.Funct(); // uses the wrong extension function
}
}
个对象?
更新 用法示例:
obj.Funct()
更新2
我注意到一些使用不同的答案和建议。所以只是为了澄清:
我明白使用不同的结构可以获得输出。我也有。但是,我在寻找是否有一种方法可以使结构适用于这种特定用途。主要原因是这是我发现的最简单的用法,我的主要目的是以最简单的方式实现此功能。
所以基本上我正在寻找obj2.Funct()
和eclipse.buildId=unknown
java.version=1.8.0_152
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US
Framework arguments: -product org.eclipse.platform.ide
Command-line arguments: -product org.eclipse.platform.ide -data /{HOME}/eclipse-workspace/../runtime-New_configuration -dev file:/{HOME}/eclipse-workspace/.metadata/.plugins/org.eclipse.pde.core/New_configuration/dev.properties -os win32 -ws win32 -arc$
!ENTRY org.eclipse.osgi 4 0 2017-12-07 23:43:27.145
!MESSAGE Application error
!STACK 1
java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:
no swt-win32-4530 in java.library.path
no swt-win32 in java.library.path
Can't load library: /{HOME}/.swt/lib/macosx/x86_64/libswt-win32-4530.jnilib
Can't load library: /{HOME}/.swt/lib/macosx/x86_64/libswt-win32.jnilib
at org.eclipse.swt.internal.Library.loadLibrary(Library.java:327)
at org.eclipse.swt.internal.Library.loadLibrary(Library.java:236)
at org.eclipse.swt.internal.C.<clinit>(C.java:16)
at org.eclipse.swt.widgets.Display.<clinit>(Display.java:138)
at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:774)
at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:162)
at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay(IDEApplication.java:169)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:111)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:669)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608)
的确切用法,而不需要传递泛型或参数。
答案 0 :(得分:0)
不是最好的,但你可以这样做:
public static List<T> Funct<T>(this T obj, Iinterface type)
where T : Iinterface, new()
public static void Funct(this Iinterface2 obj, Iinterface2 type)
这些第二个参数只是为了帮助您的编译器。 但是,您必须将对象作为参数传递两倍,这很麻烦。
public static void Main()
{
MyObjType obj = new MyObjType();
List<MyObjType> list = obj.Funct(obj); // still works as expected
SomeOtherClass obj2 = new SomeOtherClass();
obj2.Funct(obj2); // uses the correct one, now
}
但是,恕我直言的最佳解决方案是改变你的分机名称。
返回列表的方法,而不返回列表的方法。显然,他们不会做同样的工作。
那么,为什么他们的名字完全相同?
答案 1 :(得分:0)
关于使用接口的重点是隐藏实现的细节,所以你应该考虑做这样的事情:
public static List<Iinterface> Funct(this Iinterface obj)
{
var list = new List<Iinterface>();
//Add your logic here.
return list;
}
然后像这样消费:
MyObjType obj = new MyObjType();
List<Iinterface> list = obj.Funct();