一直使用 WebRequest ,发现代码
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:3819/WebForm1.aspx");发现 继承关系是 class HttpWebRequest : WebRequest ,理论上是不允许父类型转换成子类型的,如何实现的?难到是: public abstract class Father
{
public virtual string Name { get; set; }
public static Father CreateInstance
{
get
{
return new Son();//关键在这?!
}
}
} public class Son : Father
{
public override string Name
{
get { return "杯具的娃娃"; }
}
} Son s = (Son)Father.CreateInstance;
string name = s.Name;
如果是这样的,这样设计有撒好处,否则是如何做到的?
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:3819/WebForm1.aspx");发现 继承关系是 class HttpWebRequest : WebRequest ,理论上是不允许父类型转换成子类型的,如何实现的?难到是: public abstract class Father
{
public virtual string Name { get; set; }
public static Father CreateInstance
{
get
{
return new Son();//关键在这?!
}
}
} public class Son : Father
{
public override string Name
{
get { return "杯具的娃娃"; }
}
} Son s = (Son)Father.CreateInstance;
string name = s.Name;
如果是这样的,这样设计有撒好处,否则是如何做到的?
{
get
{
return new Son();//关键在这?!
}
}
}不是啊,这样是对的,如果写成将Father的位置和Son对调就不对了
这是里斯替换原则里面的一条,楼主查查!!!
在事件里面,Object sender Object可是顶级类了,(TextBox)sender 强制类型转换是没问题的吧。
楼主,估计你想太多有点乱了。淡定、淡定
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("ftp://localhost/");
其实就是个强制转换而已,前提是你已经知道得到的类型
bool test = WebRequest.Create("http://localhost:3819/WebForm1.aspx") is HttpWebRequest;
得到的结果是true,所以强制类型转换没有问题。WebRequest.Create静态方法扮演工厂的角色,根据不同url返回不通的类对象,
好处是调用者不必关心具体处理Web请求的是哪个类,不管url是http:// 还是ftp:// 或者file://,
都可以用WebRequest中的方法属性进行处理,虽然实际上它们分别是由HttpWebRequest, FtpWebRequest, FileWebRequest 来实际负责处理的。
WebRequest.Create 方法 (String)
//实际上Create函数返回的就是你所指的父类型WebRequest
public static WebRequest Create (
string requestUriString
)
之所以你能将结果转换为子类型HttpWebRequest,
恰恰是因为Create函数的内部用HttpWebRequest, FtpWebRequest, FileWebRequest 这些子类型替换了父类型,碰巧,你的Create函数执行的结果是由HttpWebRequest替换来的,
所以,你才能强制转换成功
Base a = new SubClass();然后可以使用赋值语句和强制类型转换将父类型变量赋给子类型变量。
SubClass b = (SubClass)a;但是前提是父类型变量指向的Object一定是子类型的。想下面的一样会报错。
Base c = new Base();
SubClass d = (SubClass)c;因此最重要的是,内存中的Object是什么类型的。