我可以这样做:
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类中对其进行处理。
这可能吗?我怎样才能做到这一点?为什么接口将类的属性变成方法?
答案 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)
您实际上有两个问题:
因此请使用以下内容:
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();
}
}