我在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)
任何帮助和解释都会有所帮助吗?
您的s变量仍然是类型IShape.只是因为你碰巧在分配时使用了一个强制转换器,并没有改变编译器所涉及的类型.你需要:
Square s = (Square) shape;
s.PrintMore();
Run Code Online (Sandbox Code Playgroud)
当然,如果这只会工作,shape真的是一个Square(假设有没有自定义转换回事).
我会建议你在走这条路之前仔细考虑一下.通常像这样的演员表示你在某种程度上打破了抽象 - 如果你只知道shape作为一个IShape,你应该(通常)只能与你的成员做你需要的IShape.如果不是这样,您可以:
IShape更强大(给它更多的成员)Square而不是IShape