使用可见性修饰符覆盖接口成员函数的正确语法是什么?

时间:2016-09-06 13:33:25

标签: kotlin

两个页面中的任何一个,Interfaces上的那个页面和Visibility Modifiers上的那个页面都没有提供我所遵循的语法的示例,所以我问。

我有这样的界面:

return Json(new { link = "img/Post/" + fileName }, JsonRequestBehavior.AllowGet);

我正在为它编写一个实现,但下面列出的三个语法都不起作用。每次,编译器都会报告以下错误:

  
      
  1. 'authenticateUser'不会覆盖任何内容

  2.   
  3. 类'DatabaseAuthenticationManager'必须声明为abstract或实现抽象成员public abstract fun authenticateUser(userName:String,password:String,appId:String,appSecret:String):在bookyard.contracts.IAuthenticationManager中定义的OperationResult

  4.   
import csv

with open('items.csv', 'rB') as f:
 csv_reader = csv.reader(f)
 for row in csv_reader:
     try:
         D[row[0]] = [float(x) for x in row[1:]]
     except ValueError as e:
         D[row[0]] = [float(f) for f in x.split() if f!='None' for x in row[1:]]

2 个答案:

答案 0 :(得分:3)

您的问题是,在尝试实现接口时,您正在使用可空字符串。

来自Kotlin's documentation about null-safety ...

  

在Kotlin中,类型系统区分可以保存null(可空引用)的引用和不能引用null的引用(非空引用)。

Kotlin将

String?(可空字符串)和String视为不同类型。因此编译器认为您尚未实现该方法。

您的选择......

您有两个选择:

  1. 更新您的界面以使用可为空的参数(通过在每种类型的末尾添加?)。

  2. 更新您的实施以使用不可为空的参数(String)。

  3. 我认为选项2稍微更清晰,因为它不会破坏任何其他现有的接口实现。

    示例(对于选项2):

    界面保持不变。

    以下是新实施......

    package bookyard.server.util
    
    import bookyard.contracts.IAuthenticationManager
    
    class DatabaseAuthenticationManager : IAuthenticationManager<User> {
    
        override fun authenticateUser(userName : String,
                                      password : String,
                                      appId : String,
                                      appSecret : String) : OperationResult<User> {
            // Your implementation...
        }
    }
    

    您可以看到我所做的就是将每个参数从String?更改为String

    注意:

    • 默认情况下,类/字段/界面公开public关键字是不必要的。

    • Kotlin有分号推断,所以您不需要自己添加分号。有罕见的情况,您实际上需要,但编译器会提前警告您。

答案 1 :(得分:1)

每个重写的方法都需要符合接口声明的参数nullability。换句话说,实现接口的正确方法是:

class DatabaseAuthenticationManager :  IAuthenticationManager<User> {
    override fun authenticateUser(userName: String, password: String, appId: String, appSecret: String): OperationResult<User> {
        ...
    }
}