N多数上写的清楚  抽象类不能实例化 只能继承 在子类中实现全部方法后 子类可以实例化对象
N多blog上写到  抽象类不能实例化但有人辩解到   不能直接实例化     而不是不能实例化.
http://topic.csdn.net/u/20080909/23/6c542080-910d-45cf-9bca-07bcdd5d838e.html
我一直认为 抽象类是不能实例化的
但今天看到个例子
XmlReader rdr = XmlReader.Create("book.xml");
书上原话, 高级编程 P594
"XmlReader是一个抽象类, 所以 要直接使用XmlReader类 , 必须添加静态方法Create, 该方法返回一个XmlReader对象."我搞不清楚概念了, 也有点儿蒙, 不知如何理解
一直以来,我认为通过类,创造对象的过程就是实例化的过程. 今天看来有点儿晕....
对象 != 实例化  ?欢迎大家来讨论下.

解决方案 »

  1.   

    internal class XmlTextReaderImpl : XmlReader, IXmlLineInfo, IXmlNamespaceResolverprivate static XmlReader CreateReaderImpl(Stream input, XmlReaderSettings settings, Uri baseUri, string baseUriStr, XmlParserContext inputContext, bool closeInput)
    {
        if (input == null)
        {
            throw new ArgumentNullException("input");
        }
        if (baseUriStr == null)
        {
            baseUriStr = string.Empty;
        }
        XmlReader reader = new XmlTextReaderImpl(input, null, 0, settings, baseUri, baseUriStr, inputContext, closeInput);
        if (settings.ValidationType != ValidationType.None)
        {
            reader = AddValidation(reader, settings);
        }
        return reader;
    } 这是Create方法里的源代码,你看看它是实例化的抽象类还是其他类?
      

  2.   

    public static XmlReader Create(Stream input)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        return CreateReaderImpl(input, settings, null, string.Empty, null, settings.CloseInput);

      

  3.   

    public static XmlReader Create(string inputUri)
    {
        return Create(inputUri, null, null);

      

  4.   

    XmlReader rdr = XmlReader.Create("book.xml");这里没有实例化啊。
      

  5.   

      XmlReader.Create("book.xml");
    是创建一个XmlReader对象.  就像string aa = "54";同样也是把"54"这个字符串对象赋予aa.
      

  6.   

    "XmlReader是一个抽象类, 所以 要直接使用XmlReader类 , 必须添加静态方法Create, 该方法返回一个XmlReader对象." 应该说这句话有误吧
    抽象类确实不能实例化,但是抽象类的引用变量可以指向子类对象
    这里xmlReader.Create返回的应该是该类的子类的对象引用
      

  7.   

    当你不能理解的时候,建议你用reflector看看这个类的源代码,你就会明白了。
      

  8.   

    XmlReader rdr = XmlReader.Create("book.xml");实质还是调用了子类的方法来实例化的
    在XmlReader.Create(string)的静态方法内部调用了字类的构造方法,你可以看一下源代码.
      

  9.   

    "XmlReader是一个抽象类, 所以 要直接使用XmlReader类 , 必须添加静态方法Create, 该方法返回一个XmlReader对象."确切地说,是:该方法返回一个XmlReader子类对象作为XmlReader对象
     
      

  10.   

    XmlReader这个对象并没有实例化.仅仅是调用了它的一个静态方法.
    静态方法是直接通过类调用的
      

  11.   

    感谢大家的讨论   我好像貌似 清楚一些了
    还需要弄顺下
    至少 目前 我坚信 抽象类不能实例化XmlReader rdr = XmlReader.Create("book.xml"); 意思是 父类对象的引用 指向 子类对象.. Right?
      

  12.   

     通俗点说,就是XmlReader rdr 这个对象 是引用的XmlReader.Create("book.xml")创建出来的空间,可以这样理解,但是不知道这样的说法对不对。
      

  13.   

    谢谢上面朋友的提议!
    public static XmlReader Create(string inputUri, XmlReaderSettings settings, XmlParserContext inputContext)
    {
        XmlReader reader;
        if (inputUri == null)
        {
            throw new ArgumentNullException("inputUri");
        }
        if (inputUri.Length == 0)
        {
            throw new ArgumentException(Res.GetString("XmlConvert_BadUri"), "inputUri");
        }
        if (settings == null)
        {
            settings = new XmlReaderSettings();
        }
        XmlResolver xmlResolver = settings.GetXmlResolver();
        if (xmlResolver == null)
        {
            xmlResolver = new XmlUrlResolver();
        }
        Uri absoluteUri = xmlResolver.ResolveUri(null, inputUri);
        Stream input = (Stream) xmlResolver.GetEntity(absoluteUri, string.Empty, typeof(Stream));
        if (input == null)
        {
            throw new XmlException("Xml_CannotResolveUrl", inputUri);
        }
        try
        {
            reader = CreateReaderImpl(input, settings, absoluteUri, absoluteUri.ToString(), inputContext, true);
        }
        catch
        {
            input.Close();
            throw;
        }
        return reader;
    }
      

  14.   

    抽象类具有以下特性:
    抽象类不能实例化。
    抽象类可以包含抽象方法和抽象访问器。
    不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
    从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现
    ===================
    这些概念是肯定没有问题的.你不要看到
    抽象类 类对象= xxxx,就认为是抽象类实例化了也许xxx返回的是一个实现了抽象类的子类对象
      

  15.   

    抽象类不能继承? 这么雷? 还是我记错了, 我现在好像在玩扫雷哦!
    ==========
    我哪里说抽象类不能继承?
    我说的是
    不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。 
    你不明白这话什么意思?
      

  16.   

    sealed 修饰的类是密封类将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。msdn上的那句话是这个意思.你不要理解错了.
      

  17.   

    我来扫雷了, 避免误导.
    估计上面的朋友lovehongyun 是笔误.1--- 抽象类不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义。例如,类库可以定义一个作为其多个函数的参数的抽象类,并要求程序员使用该库通过创建派生类来提供自己的类实现。
    2--- 密封类不能用作基类。因此,它也不能是抽象类。密封类主要用于防止派生。由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。
    例如:
    public class D : C
    {
        public sealed override void DoWork() { }
    }
    FYI
      

  18.   

    lovehongyun  的意思是 如果用了 sealed修饰抽象类的话,那么抽象类就不能被继承,这样就失去抽象类存在的意义了。
    所以抽象类不能被sealed修饰.
      

  19.   

    So So So,
    明白了
    lovehongyun 说的不错  我理解有偏差
    呵呵感觉这帖子不加分 对不起各位哈!
      

  20.   

    楼主不要误解lovehongyun  的意思。
    lovehongyun说的那是相当的正确,你要是用了sealed密封来修饰抽象类,那就表示这个类不能继承了,如果一个类不能继承了,那它的抽象方法如何实现?所以不能用sealed修饰抽象类。
      

  21.   


    请教大哥,这个源代码是从那里弄来的哦,我怎么用Reflector.exe看不到该代码,谢谢。
      

  22.   

    哦,我看到了。右键点Disassebler就可以看到该方法的源代码。
      

  23.   

    查这个啊CreateReaderImplDeclaring Type: System.Xml.XmlReader 
    Assembly: System.Xml, Version=2.0.0.0 
      

  24.   

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create("books.xml");msdn 就是这样写得,我也没搞明白
      

  25.   

    //对,就是说不是XmlReader rdr = new XmlReader();
    这样一定是不可以的,因为它是抽象类.
    可以把抽象类直接理解成一个接口好了!
      

  26.   

    LZ不是吧,学学C++,看看类型转换的实质就知道了
      

  27.   

    一年后  我又回来看看
    确实   lovehongyun  说的没错   是偶理解出了问题, 呵呵. 抱歉了.另外  觉得定期回头看看自己发过的帖子  对于一些问题 可以加深印象  maybe 还能有新的体会,或者更正吧.
    再次谢谢帖子上的朋友, 谢谢帮助!