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对象."我搞不清楚概念了, 也有点儿蒙, 不知如何理解
一直以来,我认为通过类,创造对象的过程就是实例化的过程. 今天看来有点儿晕....
对象 != 实例化 ?欢迎大家来讨论下.
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对象."我搞不清楚概念了, 也有点儿蒙, 不知如何理解
一直以来,我认为通过类,创造对象的过程就是实例化的过程. 今天看来有点儿晕....
对象 != 实例化 ?欢迎大家来讨论下.
{
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方法里的源代码,你看看它是实例化的抽象类还是其他类?
{
XmlReaderSettings settings = new XmlReaderSettings();
return CreateReaderImpl(input, settings, null, string.Empty, null, settings.CloseInput);
}
{
return Create(inputUri, null, null);
}
是创建一个XmlReader对象. 就像string aa = "54";同样也是把"54"这个字符串对象赋予aa.
抽象类确实不能实例化,但是抽象类的引用变量可以指向子类对象
这里xmlReader.Create返回的应该是该类的子类的对象引用
在XmlReader.Create(string)的静态方法内部调用了字类的构造方法,你可以看一下源代码.
静态方法是直接通过类调用的
还需要弄顺下
至少 目前 我坚信 抽象类不能实例化XmlReader rdr = XmlReader.Create("book.xml"); 意思是 父类对象的引用 指向 子类对象.. Right?
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;
}
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现
===================
这些概念是肯定没有问题的.你不要看到
抽象类 类对象= xxxx,就认为是抽象类实例化了也许xxx返回的是一个实现了抽象类的子类对象
==========
我哪里说抽象类不能继承?
我说的是
不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
你不明白这话什么意思?
估计上面的朋友lovehongyun 是笔误.1--- 抽象类不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义。例如,类库可以定义一个作为其多个函数的参数的抽象类,并要求程序员使用该库通过创建派生类来提供自己的类实现。
2--- 密封类不能用作基类。因此,它也不能是抽象类。密封类主要用于防止派生。由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。
例如:
public class D : C
{
public sealed override void DoWork() { }
}
FYI
所以抽象类不能被sealed修饰.
明白了
lovehongyun 说的不错 我理解有偏差
呵呵感觉这帖子不加分 对不起各位哈!
lovehongyun说的那是相当的正确,你要是用了sealed密封来修饰抽象类,那就表示这个类不能继承了,如果一个类不能继承了,那它的抽象方法如何实现?所以不能用sealed修饰抽象类。
请教大哥,这个源代码是从那里弄来的哦,我怎么用Reflector.exe看不到该代码,谢谢。
Assembly: System.Xml, Version=2.0.0.0
XmlReader reader = XmlReader.Create("books.xml");msdn 就是这样写得,我也没搞明白
这样一定是不可以的,因为它是抽象类.
可以把抽象类直接理解成一个接口好了!
确实 lovehongyun 说的没错 是偶理解出了问题, 呵呵. 抱歉了.另外 觉得定期回头看看自己发过的帖子 对于一些问题 可以加深印象 maybe 还能有新的体会,或者更正吧.
再次谢谢帖子上的朋友, 谢谢帮助!