C# 如何在自己的类中调用接口方法?
My MySqlConnection类实现了C# 如何在自己的类中调用接口方法?,c#,interface,methods,C#,Interface,Methods,My MySqlConnection类实现了IDatabaseConnection接口。在更新方法中,我想调用connect(),但它找不到此方法,我如何调用它 class MySqlConnection : IDatabaseConnection { void IDatabaseConnection.connect() { ... } void IDatabaseConnection.update() {
IDatabaseConnection
接口。在更新方法中,我想调用connect()
,但它找不到此方法,我如何调用它
class MySqlConnection : IDatabaseConnection
{
void IDatabaseConnection.connect()
{
...
}
void IDatabaseConnection.update()
{
connect(); // here
...
}
}
您可以使用:
(this as IDatabase).connect();
原因是您正在显式实现此接口,因此只能在转换后调用这些方法。为什么要显式地实现它并将这些方法设置为私有的?我认为连接类有
public
connect
和update
方法更为常见 显然,您正在使用显式接口实现,但语法不正确(不能在其上指定访问修饰符)
要调用该方法,只需将this
强制转换为IDatabaseConnection
:
void IDatabase.update(){
((IDatabase)this).connect();
...
}
这称为显式接口实现。但是,如果您这样编写类,它将正常工作:
class MySqlConnection : IDatabase
{
public void connect()
{
...
}
public void update()
{
connect(); // here
...
}
}
请注意,这些方法是作为公共方法实现的
显式实现使它们在任何地方都不可访问,即使在类本身内部也是如此。这就是为什么在声明它们时不能使用private
关键字的原因。但是,它们仍然可以通过接口“公开”访问。如果出于某种原因,您确实希望使用显式实现,您可以强制转换到接口并从接口调用:
((IDatabase)this).connect();
显式接口实现:
class MySqlConnection : IDatabaseConnection
{
void IDatabaseConnection.connect()
{
//
}
void IDatabaseConnection.update()
{
(this as IDatabaseConnection).connect();
}
}
class MySqlConnection : IDatabaseConnection
{
public void connect()
{
//
}
public void update()
{
connect();
}
}
更好-隐式接口实现:
class MySqlConnection : IDatabaseConnection
{
void IDatabaseConnection.connect()
{
//
}
void IDatabaseConnection.update()
{
(this as IDatabaseConnection).connect();
}
}
class MySqlConnection : IDatabaseConnection
{
public void connect()
{
//
}
public void update()
{
connect();
}
}
这里似乎有几个问题——您的MySqlConnection没有实现IDatabase接口,但您在该接口中显式实现了一个方法 这可能会有帮助--我可能误解了你想要实现的目标
IDatabaseConnection和
IDatabase
之间的相关性是什么?@abatishchev:我想应该是IDatabaseConnection
而已?哦,谢谢你。我现在就改,这不是个好办法;这里最好使用显式强制转换<当强制转换可能失败时,应该使用code>as,并且通常后跟一个null
-test。@Ani:这一点很好,但在这里没有什么区别,因为编译器不会关心强制转换。@Martinho Fernandes:这是关于可读性的;作为一个代码的读者,我会被愚弄到认为这个角色可能会失败;这里可能存在空解引用问题。静态代码分析工具也是如此。@Ani:可读性可能是一个因素。我个人并不在意,但若其他人发现问题,那个么常规演员阵容会更好。但是智能代码分析工具知道,因为类实现了接口,并且this
从不为null,所以它从不失败。例如,R#足够聪明。+1。当然,另一种替代方法是隐式实现接口,除非这是不可取的。操作符as
比cast
工作(稍微)快,不是吗?@abatishchev:在as
和常规cast之间进行选择的原因不是性能。这是他们的行为as
在失败时将生成一个null
,而常规强制转换将抛出一个异常。@Martinho:(null).connect()
也将引发异常:)@abatishchev:一个无意义且没有帮助的异常。问题是,如果强制转换有时会失败,请使用as
并检查null。如果强制转换不可能失败,请使用常规强制转换。若它不能失败,但它确实失败了,那个么它就会爆炸,这就是异常的用途,而不是控制流。捕获NullReferenceException或InvalidCastException是错误的。为什么说隐式实现更好?我通常会同意,但是OP使用显式实现可能有一个很好的理由…+1同意隐式实现在大多数情况下更合理。@Thomas:我认为只有当您继承了两个具有相同名称的方法的接口并且它们的实现应该不同时,显式实现才应该发生,例如IFoo:Do()
和IBar:Do()