使用和实现接口关系有什么区别?如何将它们实现到代码中(例如java)?(也许更好地解释我的问题:我有一个界面,说我和两个类,说A和B.A类意识到我和B级使用I.这些关系之间有什么区别以及它应该如何实现?)..我找到了很多定义,但我仍然没有看到差异.
非常感谢你
我有一个函数将数据写入任何实现接口的Write(b []byte) (n int, err error)方法.现在在我的程序中,我写了一个实际的Conn,但遵循最佳实践(https://dave.cheney.net/2016/08/20/solid-go-design),因为我只打电话Write,我想接受最低限度实现该方法的接口.为此,我接受带接口的参数io.Writer.
由于我的功能可以非常快速地输出大量数据,我应该接受bufio.Writer吗?或者功能的消费者责任是使用缓冲编写器而不是普通编写器?什么是最佳做法?
我有一个Go界面:
type People interface {
GetName() string
GetAge() string
}
Run Code Online (Sandbox Code Playgroud)
现在我想要另一个界面Student:
1.
type Student interface {
GetName() string
GetAge() string
GetScore() int
GetSchoolName() string
}
Run Code Online (Sandbox Code Playgroud)
但我不想写重复的函数GetName和GetAge.
有没有一种方法,以避免写入GetName和GetAge在Student界面?喜欢:
2.
type Student interface {
People interface
GetScore() int
GetSchoolName() string
}
Run Code Online (Sandbox Code Playgroud) TypeScript允许检查是否检查未知属性.下列
interface MyInterface {
key: string
}
const myVar: MyInterface = {
asda: 'asdfadf'
}
Run Code Online (Sandbox Code Playgroud)
会失败的
输入'{asda:string; }'不能赋值为'MyInterface'.
对象文字只能指定已知属性,'myInterface'类型中不存在'asda'.
但是,此语句将编译没有任何问题.空接口将接受任何值
interface EmptyInterface {
}
const myVar: EmptyInterface = {
asda: 'asdfadf'
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我真的想为可能没有任何属性的空对象定义类型,该怎么办?我怎样才能在打字稿中实现这一目标?
我应该如何调用具有返回类的新实例的抽象方法的接口?
例如,我有一个Foo类,它execute是一个Parser实现类的实例Runnable,它由一个实现ParserXXX接口的类创建.(不是直接创建Parser实例,为了允许使用自定义Parser)我该ParserXXX怎么称呼?
@FunctionalInterface // >Java 8
interface ParserXXX {
Runnable get(Data data);
}
class Parser implements Runnable {
...
}
class Foo {
private ParserXXX;
public Foo() {
xxx = new ParserXXX() { // anonymous class
@Override
public Runnable get(Data data) {
return new Parser(data);
}
}
xxx = Parser::new; // using method reference(>Java 8)
xxx = data -> new Parser(data); // using lambda …Run Code Online (Sandbox Code Playgroud) 所以我正在创建一个插件插件,但这并不是那么重要.
我有一个Selection类,它保存有关x,z,宽度,深度内容的2D区域的信息.在某个点上,矩形或椭圆将填充到该选择中.我的Ellipse和Rectangle类实现了一个接口Shape.
在Selection的consturctor中,我想确定以后使用的形状的类型.我的第一个想法是传递类类型
public Selection(Class<Shape> shapeType) {
Run Code Online (Sandbox Code Playgroud)
所以我之后可以创建该类的对象
Constructor<Shape> cons = shapeType.getConstructor(//Well I also don't know what belongs here);
Shape s = cons.newInstance(this);
Run Code Online (Sandbox Code Playgroud)
最后我得到了一个NullpointerException,因为Shape接口没有构造函数.
我很困惑.我应该将Shape接口更改为抽象类,还是只在构造函数中传递一些像ELLIPSE和RECTANGLE这样的int ?有人知道我能做什么吗?
在此先感谢Mighty One
为什么我不能用Java做到这一点:
interface Context{
void add(Integer o);
}
class Subclass implements Context{
@Override
public void add(Object o){...}
}
Run Code Online (Sandbox Code Playgroud)
难道Subclass.add不会实现Context.add,因为它添加(Object)可以执行所有add(Integer)可以吗?
这有什么好办法?
现在我正在做一种丑陋的方式:
private void actuallyAdd(Object o){...}
public void add(Object o){actuallyAdd(o);}
public void add(Integer o){actuallyAdd(o);}
Run Code Online (Sandbox Code Playgroud)
编辑:这不是上述问题的重复.在给定的问题中,超类是具有更通用的"对象"作为参数的超类,而子类更具体.这不起作用,因为更具体的方法可能无法处理任何对象.在我的问题中,子类不如超类特定,这意味着子类总是能够处理超类所需的任何内容.
在下面的示例中,模块outer具有私有类型Private和私有内部模块inner.inner能够访问Private(因为子模块可以访问其父项的私有项,即使它们没有被公开).
inner定义一个函数not_really_public_interface().虽然它被标记为公开,但它实际上只能用于outer因为inner它本身不公开.
outer.rs
struct Private;
mod inner {
use super::Private;
pub fn not_really_public_interface() -> Private {
Private
}
}
Run Code Online (Sandbox Code Playgroud)
这编译没有任何问题.
outer应该能够用来inner::not_really_public_interface()获取Private,只要它确保不输出它.所以我们这样做:
pub fn main() {
let _ = self::inner::not_really_public_interface();
}
Run Code Online (Sandbox Code Playgroud)
对?
标准错误
error[E0446]: private type `Private` in public interface
--> src/outer.rs:4:3
|
4 | / pub fn not_really_public_interface() -> Private {
5 | | Private …Run Code Online (Sandbox Code Playgroud) 为什么任何人在JAVA 1.8中的接口中定义静态方法?
我需要知道静态方法会派上用场的不同示例/用例/要求.
接口中的静态方法如何对开发人员有益?
我和C#一起工作多年,所以我试图在GO中找到相似之处(我对此很新).
我的目标:
我想error通过一种方法来扩展接口,因为Check()我能够error.Check()通过(在我看来)更好的可读代码来调用.
我当前的状态:
我已经学习了如何使用这种语法通过方法扩展类型:
func (foo T) MyExtension() returnType {
// return something
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
看起来这只适用于类型而不适用于接口.正如我迄今所看到的error是interface,这些会用来许多包来描述自己的错误类型的基础.我不想扩展这个错误类型(从包),而是想扩展接口以涵盖所有.我找不到任何语法.因为我也不知道这个的技术术语(它不是extension-method)我在谷歌搜索时有点迷失.
那么有没有办法error通过一般方法扩展接口?