一直使用 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;
 如果是这样的,这样设计有撒好处,否则是如何做到的?

解决方案 »

  1.   

    public static Father CreateInstance
    {
      get
      {
         return new Son();//关键在这?!
      }
    }
    }不是啊,这样是对的,如果写成将Father的位置和Son对调就不对了
    这是里斯替换原则里面的一条,楼主查查!!!
      

  2.   

    子类可以替换父类。一个常用的例子:
    在事件里面,Object sender   Object可是顶级类了,(TextBox)sender 强制类型转换是没问题的吧。
    楼主,估计你想太多有点乱了。淡定、淡定
      

  3.   

    貌似以前看过 子类 is a 父类,LZ的问题值得深思
      

  4.   

    B:A,然后A:B,这样可以互转了吧,嘿嘿。。
      

  5.   

    lz再试试这个
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("ftp://localhost/");
    其实就是个强制转换而已,前提是你已经知道得到的类型
      

  6.   

    WebRequest.Create方法返回的就是HttpWebRequest对象,可以这样测试:
    bool test = WebRequest.Create("http://localhost:3819/WebForm1.aspx") is HttpWebRequest;
    得到的结果是true,所以强制类型转换没有问题。WebRequest.Create静态方法扮演工厂的角色,根据不同url返回不通的类对象,
    好处是调用者不必关心具体处理Web请求的是哪个类,不管url是http:// 还是ftp:// 或者file://,
    都可以用WebRequest中的方法属性进行处理,虽然实际上它们分别是由HttpWebRequest, FtpWebRequest, FileWebRequest 来实际负责处理的。
      

  7.   

    其实楼主的理解反了,首先我给出微软的MSDN链接:
    WebRequest.Create 方法 (String)

        //实际上Create函数返回的就是你所指的父类型WebRequest
        public static WebRequest Create (
    string requestUriString
    )
    之所以你能将结果转换为子类型HttpWebRequest,
    恰恰是因为Create函数的内部用HttpWebRequest, FtpWebRequest, FileWebRequest 这些子类型替换了父类型,碰巧,你的Create函数执行的结果是由HttpWebRequest替换来的,
    所以,你才能强制转换成功
      

  8.   

    其实net的引用类型不存在类型转换的问题。Object是内存中的类型是不变的,规则是:可以将子类型的object赋给父类型的变量,使用父类型的引用的时候无法访问子类型的成员。fair enough. 
    Base a = new SubClass();然后可以使用赋值语句和强制类型转换将父类型变量赋给子类型变量。
    SubClass b = (SubClass)a;但是前提是父类型变量指向的Object一定是子类型的。想下面的一样会报错。
    Base c = new Base();
    SubClass d = (SubClass)c;因此最重要的是,内存中的Object是什么类型的。