标签: interface

动态选择类别

首先,我不知道如何称呼我的问题,所以任何更好的标题建议请告诉我。

我想创建一个接口,以便其他人可以添加他们的实现,然后在运行时决定使用哪个实现。

即我创建了一个接口“Food”,并且存在 2 个实现“Breakfast”和“Lunch”。在实现中,两者具有相同的方法名称和相同的参数,我想让用户在运行时调用它们中的任何一个。“makeFood() 使用早餐”或“makeFood() 使用午餐”。

一种可能性是仅编译一种实现,但是如果将来必须使用其他实现,则需要删除 .class 文件。

或者我应该使用某种类型的继承?

另外(不是优先级):我不知道实现类名称,所以有人可以创建“晚餐”或“第二早餐”。这会让我陷入另一个困境,如果用户请求一个尚未实现的“类”该怎么办:SI 总是可以假设用户知道哪些实现可用。

java inheritance interface

0
推荐指数
1
解决办法
4170
查看次数

C# 在“where TEntity : class”上实现接口

我对.NET比较陌生,并且偶然发现了这个特定问题:在遵循存储库模式教程时,该类的定义如下所示:

public class GenericRepository<TEntity> where TEntity : class { ...
Run Code Online (Sandbox Code Playgroud)

话虽这么说,这个类应该实现一个接口。既然我已经使用了该:运算符,我该怎么做呢?

我public class GenericRepository<TEntity> : IGenericRepository where TEntity : class {也尝试过public class GenericRepository<TEntity> where TEntity : class : IGenericRepository {,但没用

c# generics interface generic-constraints

0
推荐指数
1
解决办法
3074
查看次数

如何访问接口的属性

我的目的是在两个响应结构的标头和正文中使用 HTTP 状态代码。但是,无需将状态代码设置两次作为函数参数,并再次设置结构以避免冗余。

response的参数JSON()是一个允许接受两个结构的接口。编译器抛出以下异常:

response.Status undefined (type interface {} has no field or method Status)
Run Code Online (Sandbox Code Playgroud)

因为响应字段不能有状态属性。有没有其他方法可以避免设置状态代码两次?

type Response struct {
    Status int         `json:"status"`
    Data   interface{} `json:"data"`
}

type ErrorResponse struct {
    Status int      `json:"status"`
    Errors []string `json:"errors"`
}

func JSON(rw http.ResponseWriter, response interface{}) {
    payload, _ := json.MarshalIndent(response, "", "    ")
    rw.WriteHeader(response.Status)
    ...
}
Run Code Online (Sandbox Code Playgroud)

interface go

0
推荐指数
1
解决办法
3011
查看次数

为什么在java8中使用“default”关键字

在 Java 8default中引入了方法实现。我的问题是为什么需要default在方法名称/签名中有关键字。为什么不能default像通常的方法实现一样没有关键字?

java default interface java-8

0
推荐指数
1
解决办法
947
查看次数

Golang:一个地图接口,如何打印键和值

我得到一个地图界面,如:

getUsersAppInfo := usersAppInfo.GetUsersAppInfo(getUserId)
Run Code Online (Sandbox Code Playgroud)

然后我打印:

fmt.Println(getUsersAppInfo)
Run Code Online (Sandbox Code Playgroud)

得到这个,比如:

[map[appId:2 fcmServerKey:keyTestTest name:com.app]]
Run Code Online (Sandbox Code Playgroud)

问:如何只打印值,比如

appId value is 2 
name value is com.app 
fcmServerKey:keyTestTest value is keyTestTest 
Run Code Online (Sandbox Code Playgroud)

interface go

0
推荐指数
2
解决办法
9256
查看次数

如何调用实现接口的结构体的特定方法

我有以下接口和一些实现它的结构:

package main

import "fmt"

type vehicle interface {
    vehicleType() string
    numberOfWheels() int
    EngineType() string
}

// -------------------------------------------

type truck struct {
    loadCapacity int
}

func (t truck) vehicleType() string {
    return "Truck"
}

func (t truck) numberOfWheels() int {
    return 6
}

func (t truck) EngineType() string {
    return "Gasoline"
}

// -------------------------------------------
type ev struct {
    capacityInKWh int
}

func (e ev) vehicleType() string {
    return "Electric Vehicle"
}

func (e ev) numberOfWheels() int {
    return 4
} …
Run Code Online (Sandbox Code Playgroud)

interface go

0
推荐指数
1
解决办法
49
查看次数

Kotlin 接口函数作为表达式主体

在 Kotlin 中编写函数时,基本上完全在Thread创建内部实现start(),Android Studio 提供了“转换为表达式主体”的选项

在此处输入图片说明

选择这样做时,kotlin 会将函数转换为表达式主体:

在此处输入图片说明

有没有办法要求一个接口(就像这个函数覆盖的那个)?

我希望接口总是要求validate函数启动一个新的Thread并且只有 (!!) 能够执行里面的东西Thread,而不是方法体本身,因为它只会用于寻址服务器。

我知道我可以通过使用 aabstract class而不是interface这样的方式来强制这种行为:

abstract class ServerValidator<T> {
    fun validate(value: T?, function: ((ValidationResult) -> Unit)) = Thread {
        doValidation(value, function)
    }.start()

    protected abstract fun doValidation(value: T?, function: ((ValidationResult) -> Unit))
}
Run Code Online (Sandbox Code Playgroud)

这样一个继承类将能够覆盖该doValidation函数,而另一个类只能调用validate并因此始终使用新线程。

但是,我特别想知道是否可以使用接口来做这样的事情。

就像是:

interface ServerValidator<T> {
    fun validate(value: T?, function: ((ValidationResult) -> Unit)) = Thread::start
}

// or 

interface ServerValidator<T> { …
Run Code Online (Sandbox Code Playgroud)

interface kotlin

0
推荐指数
1
解决办法
75
查看次数

如果一个类使用类似的方法实现了多个接口,它是否会重载?

我很想知道如果一个类实现了两个或多个具有相似方法的接口,是否可以将其视为方法重载。如果不是,那么正确的术语是什么?

举个例子

public interface I1 {
  int method1(String input);
}

public interface I2 {
  void method1(int input);
}

public class C1 implements I1, I2 {
  public int method1(String input){ return 0;}

  public void method1(int input){}
}
Run Code Online (Sandbox Code Playgroud)

java overloading interface

0
推荐指数
1
解决办法
43
查看次数

基于UML图的观察者模式实现

题

我无法理解“可重用面向对象软件的元素”中观察者模式的以下 UML 图。谁能解释我为什么我的 Java 实现是错误的,我必须改变什么才能正确实现它?

UML-图

UML-图

尝试(但错误)实施

public interface Subject {
    
    public static final List<Observer> observers = new ArrayList<Observer>();
    
    public void attach(Observer o);
    public void detach(Observer o);
    public void notifyObservers();
}

public interface Observer { 
    public void update();
}

public class ConcreteSubject implements Subject {
    
    private String subjectState;

    @Override
    public void attach(Observer o) {
        observers.add(o);   
    }

    @Override
    public void detach(Observer o) {
        observers.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update();
        } …
Run Code Online (Sandbox Code Playgroud)

java design-patterns interface observer-pattern

0
推荐指数
1
解决办法
127
查看次数

为什么要在 Go 中的函数上实现接口?

我读到,在 Go 中,函数可以实现接口(就像在这个例子或这个例子中)。

但是让一个函数实现一个接口有什么价值呢?

例如,为什么要花时间定义一个接口、一个新的函数类型和一个方法,像这样:

type Handler interface {
    ServeHTTP(*Conn, *Request)
}

type HandlerFunc func(*Conn, *Request)

func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
    f(c, req)
}
Run Code Online (Sandbox Code Playgroud)

相反,您可以只创建一个像这样的函数:

func ServeHTTP(f func(*Conn, *Request), c *Conn, req *Request) {
    f(c, req)
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

types functional-programming interface function go

0
推荐指数
1
解决办法
109
查看次数