我们可以在接口中拥有一个类,该类具有在其中实现的接口的不同方法吗?我在这里有一个疑问,为什么Java允许在接口内编写内部类以及我们可以在哪里使用它。
在下面的程序中,我在接口中编写了一个类并实现了接口的方法。在接口的实现类中,我刚刚调用了内部类方法。
public interface StrangeInterface
{
int a=10;int b=5;
void add();
void sub();
class Inner
{
void add()
{
int c=a+b;
System.out.println("After Addition:"+c);
}
void sub()
{
int c=a-b;
System.out.println("After Subtraction:"+c);
}
}
}
abstract public class StrangeInterfaceImpl implements I {
public static void main(String args[])
{
StrangInterface.Inner i=new StrangeInterface.Inner();
i.add();
i.sub();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个抽象超类,带有一个返回子类实例的工厂。是否有可能有一个仅在超类中实现的方法?例如,在下面的代码中,是否可以删除 Wind::act()?
abstract class Element {
final String action; // what it does
String act() => action; // do it
factory Element() {
return new Wind();
}
}
class Wind implements Element {
final action = "blows";
act() => action; // Why is this necessary?
}
void main() {
print(new Element().act());
}
Run Code Online (Sandbox Code Playgroud)
删除 Wind::act() 时,出现缺少它的错误。此外,当扩展而不是实现超类时,省略子类实现不会导致错误。但对于工厂方法,扩展不是一种选择。
我有一个基类(顺序)与一组子类(生产者,特殊订单,零件订单等).
只有其中一些子类实现了一个特定的接口(ITrackingCustomer),该接口具有单个方法声明(object getcustdetails()).
作为我的解决方案的一部分,我的所有订单都在中心位置处理,即任何crud方法都通过中心层.在这个中心层,我想做以下事情:
如果订单类型为ITrackingCustomer
然后调用方法getcustdetails()
我使用以下代码工作:
if (typeof(ITrackingCustomer).IsAssignableFrom(Order.GetType()))
{
MethodInfo theMethod = Order.GetType().GetMethod("getcustdetails");
object y = theMethod.Invoke(Order, null);
}
Run Code Online (Sandbox Code Playgroud)
我对第一部分使用isassignable来感到满意,但是想对第二部分使用性能较低的方法(即使用invoke进行反射).
我的问题是:
有没有更有效的方法来执行此操作,因为我已经读过使用invoke命令是昂贵的.
我想通过一些ArrayList<Integer>X进入方法a(Collection<Integer> someCol)是采用Collection<Integer>作为输入.
我怎样才能做到这一点?我认为ArrayList是一个集合,因此我应该能够"只做它"但似乎Collection是一个接口,而ArrayList实现了这个接口.我能做些什么来使这项工作......如果你理解这个理论对我和其他许多人也有帮助.
谢谢
如何用列表实现接口成员"f"?
public interface I
{
IEnumerable<int> f { get; set; }
}
public class C:I
{
public List<int> f { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误1'ClassLibrary1.C'未实现接口成员'ClassLibrary1.I.f'.'ClassLibrary1.Cf'无法实现'ClassLibrary1.If',因为它没有匹配的返回类型'System.Collections.Generic.IEnumerable'.c:\ users\admin\documents\visual studio 2010\Projects\ClassLibrary1\Class1.cs
我有以下界面:
interface IExcelServices
{
Dictionary<string, string[]> FilterFields(Dictionary<string, string[]> excelContent);
Dictionary<string, string[]> ParseExcelFile(string path);
}
Run Code Online (Sandbox Code Playgroud)
这由以下类实现:
public class ExcelServices : IExcelServices
{
public Dictionary<string, string[]> FilterFields(Dictionary<string,
string[]> excelContent)
{
//somecode
}
public Dictionary<string, string[]> ParseExcelFile(string path)
{
//somecode
}
private void ReleaseObject(object obj)
{
//somecode
}
Run Code Online (Sandbox Code Playgroud)
}
我的代码编译没有任何问题,但我想知道是否添加一个不在接口定义中的私有方法(或通常任何方法)是一个很好的OO编程实践.
谢谢
弗朗切斯科
文档(和intellisense)非常清楚地说明了DataTable实现IListSource.但是为什么没有DataTable一个getList()方法,这是IListView接口的(主要)部分?
如果一个类从两个单独的接口实现一个接口,它的行为是否与仅实现一次相同?
例子:
public interface IAnimal { /* ... */ }
public interface IFullAnimal : IAnimal { /* ... */ }
public interface IBear : IAnimal { /* ... */ }
public interface IFullBear : IBear, IFullAnimal { /* ... */ }
// and implementing IFullBear:
public class FullBear : IFullBear { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
上面,FullBear实现了IAnimal从IFullAnimal和IBear到IFullBear。这是否会引入有关 IAnimal 实现的任何奇怪行为,因为两者IFullAnimal都IBear没有提供有关实现的任何信息IAnimal(因为该语言不允许这样做)。
Java教程中有一个"实现接口"的例子.我重复了这个例子,但它不起作用.NetBeans显示了RectanglePlus类声明左侧的错误.错误是:
rectangleplus.RectanglePlus不是抽象的,并且不会覆盖rectangleplus中的抽象方法isLargerThan(rectangleplus.Relatable).
我做的与教程中写的相同.为什么会显示错误?这是我对该项目的实施.
RectanglePlus.rectangleplus.项目中的第一个文件是Interface Relatable:
package rectangleplus;
public interface Relatable {
int isLarger(Relatable other);
}
Run Code Online (Sandbox Code Playgroud)
项目中的第二个文件是Main Class RectanglePluswith helper class Point:
package rectangleplus;
public class RectanglePlus implements Relatable {
public int width = 0;
public int height = 0;
public Point origin;
// four constructors
public RectanglePlus() {
origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
origin = p;
}
public RectanglePlus(int w, …Run Code Online (Sandbox Code Playgroud) 我有以下方法(在我的DLL中实现第三方sdk方法):
public void PlaceItem(myItemData item, IRequest request)
{
var item = (ItemClassData)item; //**myItemData is the base class for ItemClassData**
item.Id = 101;
request.Succeeded(item.Id);
}
Run Code Online (Sandbox Code Playgroud)
接口参数如下:
public interface IRequest
{
void Failed(string Error);
void Succeeded(string ItemId);
}
Run Code Online (Sandbox Code Playgroud)
我想从函数中调用此方法.我知道如何在调用此方法时将对象作为第一个参数传递.但是如何传递第二个参数(Interface).任何帮助是极大的赞赏.
c# methods interface parameter-passing interface-implementation
假设我在 F# 中有以下接口:
type InterfaceA =
abstract Magic : InterfaceA -> InterfaceA
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这样的接口?当我尝试这样做时:
type MyTypeA = {x:int} with
interface InterfaceA with
member self.Magic another =
{x=self.x+another.x}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
This expression was expected to have type 'InterfaceA' but here has type 'MyTypeA'
我希望我的类实现一个接口,并从Auditable表中获取其他属性.我可以两个都做吗?我试图在这里做,但我的IDE中出现错误.
public partial class ObjectiveDetail : IEquatable<ObjectiveDetail>, AuditableTable
{
...
}
public abstract class AuditableTable : IAuditableTable
{
...
}
Run Code Online (Sandbox Code Playgroud) 我有一个实现接口的类:
public class SQLiteHHSDBUtils : IHHSDBUtils
{
void IHHSDBUtils.SetupDB()
{
. . .
if (!TableExists("AppSettings"))
. . .
bool IHHSDBUtils.TableExists(string tableName)
{
. . .
Run Code Online (Sandbox Code Playgroud)
它找不到自己的兄弟坐在它下面(if (!TableExists()):
"TableExists"这个名称在当前上下文中不存在
它怎么样/为什么它看不到它?
interface ×8
c# ×7
java ×3
methods ×2
polymorphism ×2
.net ×1
arraylist ×1
collections ×1
dart ×1
f# ×1
factory ×1
inheritance ×1
reflection ×1