为什么我不能向接口添加类

时间:2018-12-06 15:48:29

标签: c# interface

我可以这样做:

public interface IConn
{
    bool Check();
}

public class Conn : IConn
{
    public bool Check() { //Method }
}

但是我不能这样做:

public class CustomClass { }

public interface IConn
{
    CustomClass CC();
}

public class Conn : IConn
{
    public CustomClass CC = new CustomClass();
}

相反,接口继承使我可以应用此方法:

public class Conn : IConn
{
    CustomClass IConn.CC()
    {
        throw new NotImplementedException();
    }
}

我的目标是在接口中创建对CustomClass的引用(用于智能感知),然后简单地创建它的实例并在Conn类中对其进行处理。

这可能吗?我怎样才能做到这一点?为什么接口将类的属性变成方法?

5 个答案:

答案 0 :(得分:1)

您似乎想向接口添加一个字段,以便实现该接口的所有类都需要具有该字段。接口中不允许使用字段,但属性是允许的。属性与字段非常相似,无论如何您都不应拥有公共字段。

public class CustomClass { }

public interface IConn
{
    CustomClass CC { get; set; } // or just "get;"
}

public class Conn : IConn
{
    // I have changed this to a property.
    public CustomClass CC { get; set; } = new CustomClass();
}

或者,您可以改用一种方法:

public class CustomClass { }

public interface IConn
{
    CustomClass CC();
}

public class Conn : IConn
{
    // this will always return a new instance of CustomClass, which is
    // not the same behaviour as the code in your attempt.
    public CustomClass CC() {
        return new CustomClass();
    }
}

答案 1 :(得分:1)

您实际上有两个问题:

  1. 您的接口定义了一个方法,因此您的实现类还需要一个具有相同名称和相同参数列表的方法。您似乎想要的是属性而不是方法。
  2. 您的类具有公共字段,该公共字段不实现任何内容,因为不允许接口使用。实际上,仅接口允许使用方法。但是,由于属性不过是编译器创建的一组get和set方法,因此您也可以在接口上定义它们。

因此请使用以下内容:

net:
  ssl:
    mode: preferSSL
    PEMKeyFile: /installDir/cert.pem
    CAFile: /installDir/chain.pem
    clusterFile: /installDir/cert.pem

  port: 27017
  bindIp: 0.0.0.0

security:
  clusterAuthMode: x509

答案 2 :(得分:1)

您可以“将类添加到接口中”,尽管我必须观察到我希望我正确理解了您的意思,因为该句子实际上没有任何意义。

但是让我们看看你做了什么:

public class CustomClass { }

public interface IConn
{
    CustomClass CC();
}

这将声明一个类CustomClass和一个接口IConn,并在该接口中声明一个方法CC,该方法将返回对CustomClass的引用对象。

到目前为止很好。

然后您尝试实现该接口,这是您遇到的问题所在的地方:

public class Conn : IConn
{
    public CustomClass CC = new CustomClass();
}

在这里,编译器会抱怨:

  

CS0535'Conn'未实现接口成员'IConn.CC()'

这样做的原因是,在界面中,CC是一种方法,但是在您尝试实现该界面的类中,您将CC做成了< strong> field 。

要使一个类成功并合法地实现接口,必须都实现该接口的所有成员,并且必须使用相同类型的成员来实现它们。

因此,如果您在接口中将CC声明为方法,则必须在类中将其实现为方法,就无法解决这个问题。

因此您可以将班级更改为此:

public class Conn : IConn
{
    public CustomClass CC()
    {
        return new CustomClass();
    }
}

或者,如果您使用的是较新的C#版本,并且具有表达式主体成员,则可以这样编写:

public class Conn : IConn
{
    public CustomClass CC() => new CustomClass();
}

这只是您所拥有的字符之外的几个字符。


现在,如果我误解了您的问题,并且您确实希望接口的所有实现者都实现一个字段,该怎么办?好吧,你不能那样做。

在接口中,您只能声明属性和方法,而不能声明字段,构造函数或其他内容。


现在,另外,你这样说:

  

相反,接口继承使我可以应用此方法:

public class Conn : IConn
{
    CustomClass IConn.CC()
    {
        throw new NotImplementedException();
    }
}

猜测,当时您认为这是实现该方法的唯一合法方法,但您仍然可以在其中使用该字段,因为您不能创建公共方法,并且< / strong>都具有相同名称的字段,这是非法的:

public class Conn : IConn
{
    public CustomClass CC = new CustomClass();
    public CustomClass CC() => new CustomClass();
}

您会得到的:

  

CS0102类型“ Conn”已经包含“ CC”的定义

但是,如果改为使方法显式实现该接口,则它将编译:

public class Conn : IConn
{
    public CustomClass CC = new CustomClass();
    CustomClass IConn.CC() => new CustomClass();
}

但是,现在您有两个名为CC两个成员,一个成员只能通过该界面使用,并且可能不是您想要的。


此处的最终指南。如果您打算保留CustomClass的引用,即使该引用是在实现IConn的类中构造的,那么您应该声明并实现CC作为财产。

但是,如果您打算每次“读取” CC(读取属性或调用方法,具体取决于您选择声明和实现它的方式),则将获得{ {1}},那么我认为您应该坚持使用该方法。

答案 3 :(得分:0)

您正在接口中定义一个方法。您真正想要的是物业

public interface IConn
{
   CustomClass CC { get; set }
}

答案 4 :(得分:0)

我对您的代码做了一些修改。请查看是否有帮助-

   public class CustomClass {      }

   interface IConn
   {
       CustomClass CC();
   }

   public class Conn : IConn
   {
      public CustomClass CC()
      {
         return  new CustomClass();
      }
   }