当前位置: 首页 > 编程语言 > C#

抽象类和静态类有什么区别?分享

时间:2023-04-10 12:24:43 C#

抽象类和静态类有什么区别?两者都无法实现。有什么区别,在什么情况下您可能会使用一个而不是另一个?static表示该类只能有静态成员,不能创建它的实例。这用于无状态函数(例如,仅定义扩展方法或实用方法的类型)。您还可以在非静态类上声明成员静态。这允许您将函数附加到类型而无需实例化它。这里有更多关于使用静态成员和类的详细信息。abstract定义了所有派生类型共享的基本结构和函数,但不能单独使用。我将它们视为蓝图和合同。这是OOP的核心概念。以下是有关使用摘要的更多详细信息。这里有一个简短的总结:关键区别在于您可以从抽象类继承,但不能从静态类继承。从技术上讲,.NET运行时没有任何静态类的概念,因此C#编译器将它们视为抽象和密封的(意味着您不能从它们继承)。因此,静态类也是密封的抽象类(尽管如果您是C#程序员,这不是看待问题的常见方式)并且仅包含静态成员(由C#编译器强制执行)。抽象类旨在用作类继承层次结构的基础。静态类不能是类继承层次结构的基础。静态类用于单态或无状态函数。抽象类不适合单例功能,因为即使它可能包含静态方法和字段作为静态类,它也不能禁止继承,因此单例使用可能会被子类击败。或者,至少,它会使其他程序员感到困惑,因为它的定义会传达一种与其实际预期用途不同的意图。抽象类和静态类表面上的相似之处只是都不能被实例化。除此之外,它们是完全不同的动物,具有完全不同的用例。CLR没有静态类的概念,它特定于C#。编译器通过使用类的CLR属性来做到这一点:它声明它是抽象的和密封的。这可以防止任何语言实例化此类。这是你运行Ildasm时的样子:和字段。这使得它们类似于C或Pascal等语言中的全局变量和函数。抽象类正好相反,它的设计源于。一个所有成员都抽象的抽象类就像一个接口。C#有一个关键字,它使静态类与接口完全相反。抽象类通过派生类间接实例化。它们提供共同的行为和实例状态,但表明需要更多并且必须由派生的具体类提供。例如,Transform可能是一个抽象类:它声明了一个通用的Apply(Shape)方法,但没有实现它。具体的派生类如Rotation或Translation将实现此方法,并且可以实例化这些类。静态类无法实例化,任何状态都处于类级别而不是实例级别。它们通常用于定义实用方法,其中没有与该方法关联的状态。Transform不能是静态类,因为具体的派生类需要每个实例的状态(例如,Rotation需要每个实例的Angle,因为不同的Rotation变换可以是不同的角度)。抽象类旨在用作基类;他们不能有直接实例。相反,您必须子类化,它提供抽象基类中(通常有意)遗漏的内容。示例:假设您有一个复杂的应用程序,用户可以在其中登录该应用程序。应该使用各种身份验证机制,例如您可以使用的LDAP、NTLM。在这样的上下文中对“用户”或“委托人”建模的一种方法是将所有这些机制中的共同点收集到一个抽象基类中,并在实际实现(抽象方法)的地方留下一个“空白”播放:抽象类Authenticator{protectedDictionaryuserCache;...publicUserLoadUser(stringname){用户用户;if(userCache.TryGet(name,outuser))返回用户;else{user=LoadFromStore(名称);用户缓存。添加(姓名,用户);返回用户;}}受保护的抽象用户LoadFromStore(字符串名称);在这里,用户缓存是一个常见的问题,在基本情况下建模,实际的检索留给子类来提供。静态类是完全不同的东西。它们本质上是保留实用程序功能的地方:staticclassStrUtil{publicstaticstringTrimWhitespace(stringstr){...}}将它们视为某种只能包含静态成员的特殊命名空间。基本上,放置函数的地方。抽象类的主要目的是定义一个或多个抽象方法。任何扩展抽象类的类都将实现抽象方法,否则也需要声明为“抽象”。但是,也可以将类声明为“抽象”类而不在其中实现任何抽象方法。请参见下面的示例。公共抽象类AbstractTest{publicvoidabcd(){}publicstaticvoidmain(String[]args){System.out.print("hi...");}}只有内部类可以声明为“static”,请参见下面的代码。上层/封装类不能声明为“静态”。它可以通过使用Upper/封装类变量来访问。static-inner-classname与使用类名的任何静态方法调用相同。公共类StaticTest{publicstaticvoidmain(Stringag[]){System.out.println("hello...1");StaticTest.StaticTest2.meth2();}publicstaticclassStaticTest2{publicstaticvoidmeth2(){System.out.print("hello...2");}}}抽象类(基类):允许其他类继承这个类(一个类获取另一个类的属性(方法和字段)),但禁止实例化,即我们不能拥有这个类的对象。http://csharp.net-tutorials.com/classes/abstract-classes静态类:此类无法实例化。这个类也不能继承。要访问这个类的方法,可以直接使用classname.method。https://social.technet.microsoft.com/wiki/contents/articles/21028.difference-between-static-class-sealed-class-and-abstract-class-in-c.aspx两者的主要区别是关于可扩展性。CLR在幕后将所有“静态”类标记为“抽象和密封”(即,它们不能被继承,因此不能被扩展),并且.NETFrameworkCLR在加载包含程序或命名空间时自动加载它们。这提高了运行时性能。“抽象”类背后的哲学是将所有扩展类的所有共同特征集中在一个地方。希望能帮到你。以上就是C#学习教程:抽象类和静态类有什么区别?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: