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

如何告诉继承类不要调用其基类的无参数构造函数?分享

时间:2023-04-10 18:36:23 C#

如何告诉继承类不要调用它的基类的无参数构造函数?我惊讶地发现,无论何时调用派生类中的任何构造函数,都会调用我的基类的无参数构造函数。我认为就是这样:如果我愿意,base()用于显式调用基本构造函数。在实例化派生类时如何防止调用基构造函数?使用系统;命名空间TestConstru22323{类程序{staticvoidMain(string[]args){Customercustomer=newCustomer("Jim","Smith");客户c=新客户();Console.WriteLine(客户.Display());控制台.ReadLine();}}publicclassPerson{publicPerson(){Console.WriteLine("我并不总是希望调用此构造函数。我想显式调用它。");}}publicclassCustomer:Person{privatestring_firstName;私有字符串_lastName;//publicCustomer(stringfirstName,stringlastName):base()//这显式地调用了基空构造函数publicCustomer(stringfirstName,stringlastName)//但是它无论如何都会调用它,为什么?{_firstName=名字;_姓氏=姓氏;}publicstringDisplay(){returnString.Format("{0},{1}",_lastName,_firstName);}}}唯一的方法是明确告诉它由你决定你希望它调用哪个其他基地;这当然意味着你必须选择一些basector来调用。您根本不能将其称为基础构造函数——从概念上讲,构建客户是通过首先构建一个人,然后在其之上进行特定于客户的构建来完成的。例如,假设Person有私有字段——如果允许在不首先构造Person的情况下构造Customer那么如何正确构造这些字段?在.NET中,对象层次结构中的每个对象构造函数都会被调用,无论您是否调用:base()。:base()如果未显式调用,则隐式调用:base()。如果您想在父对象上调用与默认构造函数不同的构造函数,则可以使用:base()。如果不应该每次都调用父构造函数中的代码,最好将代码移到它自己的方法中,该方法需要在构造对象后显式调用。或者,在父对象上创建参数化构造函数并使用该参数来确定是否应执行代码。例如::base(true)-这将执行您的代码。:base(false)-这不会执行您的代码。正如其他人所指出的,派生实例必须调用其基类之一的构造函数。如果要控制基类初始化逻辑的执行,去掉它的默认构造函数,换成这样:publicclassBase{//Base没有默认构造函数publicBase(boolinitialize){if(initialize){//...此处的逻辑}}}派生构造函数如下所示://Derived1执行初始化逻辑publicDerived1():base(true){}//Derived2不执行publicDerived2():base(false){}您可以使默认基类构造函数受保护,然后只为基类及其子类提供非默认构造函数。编辑您可以为基类提供具有不同签名(例如受保护枚举类型)的受保护构造函数,并将初始化代码放在那里,而默认构造函数也受到保护,不会进行任何特定的初始化。只需要为一些派生对象调用构造函数的要求不符合面向对象的原则。如果它是一个人,那么它需要以这种方式构建。如果需要对某些对象进行共享初始化,则应考虑创建Initialize方法或添加将由特定派生对象调用的参数化构造函数。参数化构造方法感觉有点尴尬:}}//...}publicclassCustomer:Person{publicCustomer(stringfirstName,stringlastName){//...}}publicclassEmployee:Person{publicCustomer(stringfirstName,stringlastName):base(true){//...}}在实例化类时,继承层次结构中的所有类都从最顶层的Parent实例化到最底层的Child,直到你实例化的类型为止。所以如果你实例化System.Text.StringBuilder(),首先调用System.Object的默认构造函数,然后再调用StringBuilder()。您可以使用base关键字来调用不同的构造函数(具有相同或更少参数的构造函数),但不能调用更多。如果未指定base,则会调用默认构造函数,因此会发生这种情况。您还可以在实例方法的上下文中使用base关键字来调用基实现,例如在装饰器模式的情况下。如果您不想调用基类私有构造函数,那么您应该使用私有默认构造函数设置子类,并在另一个构造函数上显式调用base(params)。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;namespaceConsoleApplication2{classProcessCaller{staticvoidMain(){MyDerivedmd1=newMyDerived(1);objecto=newSystem.Text.StringBuilder();//这将隐式实例化继承层次结构中的类:object,然后是stringbuilder}}publicclassMyBase{intnum;publicMyBase(){Console.WriteLine("在MyBase()");}publicMyBase(inti){num=i;Console.WriteLine("在MyBase(inti)");}publicvirtualintGetNum(){返回数字;}}publicclassMyDerived:MyBase{//设置私有构造函数。这里的base(i)没有意义,因为你没有参数privateMyDerived(){}//如果不指定base(i),此构造函数将调用MyBase.MyBase()publicMyDerived(inti):base(i){}publicoverrideintGetNum(){returnbase.GetNum();//这里我们在实例方法中使用base来调用基类实现。}}}一种方法是将您的基础默认构建该函数设置为私有,但仅当您在基类中创建辅助构造函数时才有效,并且仅在您明确需要它时才调用私有构造函数classBase{privateBase(){...specialdefaultbaselogic。..}protectedBase(...params...):this(){...调用私有cons的暴露基数...}protectedBase(...otherparams...)/*无默认调用*/{...不调用默认值的暴露缺点...}}classDerivedNoCall{publicDerivedNoCall():base(...otherparams...){}//这是非常人为的,@aakashm有最佳答案。以上是C#学习教程:如何告诉继承类不要调用其基类的无参数构造函数?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: