我已经阅读Python-Mixin并了解到它为类增加了一些功能(方法)。同样,Java-Interfaces还提供类的方法。
我可以看到的唯一区别是它们Java-interfaces是抽象方法并Python-Mixin带有实现。
还有其他区别吗?
我目前正在创建Windows窗体应用程序的结构。在实现依赖项注入时遇到了NULL REFERENCE错误。我在MVC应用程序中使用了这种方法来进行简单的单元测试,但无法弄清楚如何在Windows窗体应用程序中实现它。
这是Main表单的部分类:
public partial class pws : Form
{
private IInterfaceTasks _tasks { get; set; }
public pws(IInterfaceTasks tasks)
{
InitializeComponent();
_tasks = tasks;
}
private void cmdSave_Click(object sender, EventArgs e)
{
IEntities.AssignmentEntityRequest request = new IEntities.AssignmentEntityRequest();
<code mapping here>
_tasks.CreateAssignments(request); --> _tasks here is null
}
}
Run Code Online (Sandbox Code Playgroud)
这是继承IServiceTasks接口的类
public class CreateAssignmentsInterface : IInterfaceTasks
{
private Service.IServiceTasks _task;
public CreateAssignmentsInterface(Service.IServiceTasks task)
{
_task = task;
}
public bool CreateAssignments(IEntities.AssignmentEntityRequest request)
{
Helpers.Helpers mapper = new Helpers.Helpers();
var assignmentRequest = …Run Code Online (Sandbox Code Playgroud) 我有一个对象,它有一个我希望能够保存队列或堆栈的变量.任何具有适当逻辑的添加和删除的东西.我认为这可以通过一个接口来完成,但是这两个操作中java.util没有相同的接口或甚至相同的名称.
我现在的计划是创建一个包装器,使它们符合我的要求,但这似乎不够优雅.有没有更好的办法?
我想要的东西:
Something<E> steps;
Run Code Online (Sandbox Code Playgroud)
这样我就可以调用step.pop()和step.push()或任何方法名称,而无需知道步骤是实现队列逻辑还是堆栈逻辑.
对于我的软件工程类,我们必须用Java开发一个按钮引导的应用程序(即按下按钮切换LED).我们必须根据接口定义整体架构,然后在各种场景中实现它:按钮和LED在同一台PC上建模为GUI元素,按钮和LED建模为不在同一台机器上运行的GUI元素(例如远程),Raspberry Pi/Arduino等物理按钮和LED ......
尽管运行环境发生了变化,但接口必须相同,即只有实现必须改变.通过接口我不是指GUI,而是我的应用程序中的类将实现的接口(例如,接口iLed将由类Led实现,其方法代码将根据LED的建模方式而变化:物理LED,本地GUI元素等.).只是为了给你一个想法,在下面的链接中有draw.io接口的UML图(用draw.io打开):https://drive.google.com/file/d/0BxSY8GbXKYeAd0dZNm92ODdOSFE/view ? usp = sharing
我想要的是能够在接口(和驱动程序存根)之间来回切换以及我正在处理的完整应用程序(除了接口之外,还有实现它们的类).构建项目以实现这一目标的最佳方法是什么?拥有一个永远不会合并的两个分支的GitHub仓库是一个好主意,一个只有接口而另一个只有接口,另一个带有实际的实现(即给定执行环境的完整应用程序,接口也是如此)?如果没有,你有什么建议?我问,因为据我所知,你通常会分支添加/修改一些功能,然后与你最初分支的分支合并,这意味着分支将重新组合在一起.
更新:我问了一个愚蠢的问题,我混合B是A的子类型,然后Map<String, B>是子类型,Map<String, A>这显然是不正确的.
公共接口A {....}
public class B implements A {
....
}
Run Code Online (Sandbox Code Playgroud)
现在我有这门课.
Class abstract ABC {
public abstract Map<String, A> execute();
}
Class XYZ {
private ABC abc;
public Map<String, A> doSomeWork(){
return abc.execute()
}
}
Run Code Online (Sandbox Code Playgroud)
然后
Class DEF extends ABC {
@Override
public Map<String, B> execute(){
....
}
}
Class Main {
....
XYZ xyz = new XYZ();
DEF def = new DEF();
xyz.setABC(def);
Map<String, B> map = xyz.doSomeWork(); //incompatible type error here …Run Code Online (Sandbox Code Playgroud) 我遇到了这个问题:
以下是什么输出?
1 public class A {
2 public static void main(String[] args){
3 I i = new I() {};
4 System.out.println(I.x + i.getValue() + "" + i);
5 }
6 }
7
8 interface I {
9 int x = 10;
10
11 public default int getValue() {
12 return 5;
13 }
14
15 public default String toString() {
16 return "I";
17 }
18 }
Run Code Online (Sandbox Code Playgroud)
我的想法:
我的第一直觉告诉我 - 我是新的我(){}?因此我们无法实例化接口 - 问题1.
然后我认为公共默认String toString()?重写Object类方法?问题听起来不错 - …
我怀疑是在一个简单的类与方法的实现和接口之间.不是抽象类.为什么我们不能只创建一个List类,给出所有的方法实现,并使Array List或Linked list扩展它.不是方法的实现相同.
有没有办法使用约束来检查方法参数是否实现了多个接口?
以这个简单的例子来检查TResponse是否已经实现了IBaseSearchResponse:
public static TResponse Search<TResponse, TRequest>(TRequest args)
where TResponse : IBaseSearchResponse {}
Run Code Online (Sandbox Code Playgroud)
但我想知道它是否实现了IBaseSearchProps.我曾试图通过以下方式添加约束:
public static TResponse Search<TResponse, TRequest>(TRequest args)
where TResponse : IBaseSearchArgs where TResponse : IBaseSearchProps {}
Run Code Online (Sandbox Code Playgroud)
但是这会报告已经用于类型TResponse的约束条款:
public static TResponse Search<TResponse, TRequest>(TRequest args)
where TResponse : (IBaseSearchArgs && IBaseSearchProps) {}
Run Code Online (Sandbox Code Playgroud)
这只是非法语法
如果我的问题准备不充分,在其他地方回答或者如果答案在c#规范中定义,我事先道歉,我至少在这里看一下
public interface IInterface { }
public class MyClass { }
public static class Program {
public static void Main() {
IInterface myVariable = new MyClass();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这个代码,因为工作MyClass确实满足IInterface,但我得到一个编译错误:
错误CS0266:无法将类型"MyClass"隐式转换为"IInterface".存在显式转换(您是否错过了演员?)
为什么?
我可以使用哪种解决方法不涉及显式转换?
我发现的答案之一是"如果属于两个不同类的两个方法/变量具有相同的名称,则多重继承会导致冲突".但我认为在实现多个接口时也可能存在冲突.例如,考虑一个实现两个具有相同变量名的接口的类(变量可以在接口中定义,并且它们在默认情况下是最终的)在它们内部声明
interface Ainterface {
public final static int i=10;
}
class InterfaceCheck implements Ainterface {
public static void main(String[] args) {
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码完全正常
interface Ainterface {
public final static int i=10;
}
interface Binterface {
public static final int i=20;
}
class InterfaceCheck implements Ainterface,Binterface {
public static void main(String[] args) {
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
根据互联网上的消息来源"实现多个接口永远不会导致冲突"但上述代码会产生错误.所以这就是我所说的冲突.