使用接口在C#中进行转换,以便能够使用所有对象功能

Die*_*xel 3 c# interface

我在C#中投射对象时遇到了一些问题,除了在界面中声明的对象方法之外,还能够使用其他对象方法.以下是我所说的简单例子.

public interface IShape
{
    void Print();
}

public class Square : IShape
{
    #region IShape Members

    public void Print()
    {
        HttpContext.Current.Response.Write("Square Print Called"); 
    }   

    #endregion

    public void PrintMore()
    {
        HttpContext.Current.Response.Write("Square Print More Called"); 
    }        
}
Run Code Online (Sandbox Code Playgroud)

为什么在调用下面的代码时我无法访问PrintMore()?

IShape s = (Square)shape;
s.PrintMore() // This is not available. only Print() is. 
Run Code Online (Sandbox Code Playgroud)

任何帮助和解释都会有所帮助吗?

Jon*_*eet 5

您的s变量仍然是类型IShape.只是因为你碰巧在分配时使用了一个强制转换器,并没有改变编译器所涉及的类型.你需要:

Square s = (Square) shape;
s.PrintMore();
Run Code Online (Sandbox Code Playgroud)

当然,如果这只会工作,shape真的一个Square(假设有没有自定义转换回事).

我会建议你在走这条路之前仔细考虑一下.通常像这样的演员表示你在某种程度上打破了抽象 - 如果你只知道shape作为一个IShape,你应该(通常)只能与你的成员做你需要的IShape.如果不是这样,您可以:

  • IShape更强大(给它更多的成员)
  • 将代码更改为接受Square而不是IShape
  • 如果绝对必要的话