private 和 protected 构造函数详解

private 和 protected 构造函数详解

实现单例模式的时候经常要把构造函数标记为private 和protected以防止外部直接通过new操作符 构造一个新的实例

众所周知 private 和protected的主要区别就是 后者允许子类调用被标记为protected的方法

另外一个常识: 使用new操作符构造一个子类的过程中 .net会先构造一个父类出来 ,如此递归 直到object对象

那么也就是说 标记为protected的时候 实际上还是可以通过继承的方式间接的构造父类对象

代码如下: (new classb的同时也间接的new classa了)

public class classa
{
    protected classa()
    {
    }
}

public class classb : classa
{
    public classb()
    {
    }
}

 

 

private则没有这个问题, 但是! 标记为private以后实际上也就意味着没有类型可以继承private了

当然你可以编写如下代码: (但是编辑器会告诉你 'classa.classa()' is inaccessible due to its protection level)

public class classa
{
    private classa()
    {
    }
}

public class classb : classa
{
    public classb()
    {
    }
}

原因就是构造classb的时候没法调用classa的构造函数

从开发角度讲,如果一个类设计的时候就不想被继承或者不能被继承,那么应该标记为sealed , 以防止别人不小心继承了这个类,那么这里的classa应该被标记为密封的

那么如果是为了单例模式 private是一个比较好的选择, 密封类并protected也是一个可以使用的实现

有的时候屏蔽构造函数并不是想使用单例模式 ,而且想通过这种方式规范调用方的行为

代码如下:

public class classa
{
    protected classa()
    {
    }

    public classa create()
    {
        //这里可以做特殊操作 例如给classa的属性赋初始值,或者写点日志什么的,反正你爱干嘛干嘛
        return new classa();
    }
}

 

 

 

时间: 2024-09-19 23:58:19

private 和 protected 构造函数详解的相关文章

javascript设计模式之对象工厂函数与构造函数详解_基础知识

下面通过文字详解加代码分析的方式给大家分享下javascript设计模式之对象工厂函数与构造函数的相关知识. 概述使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法.然而,除了这两种常用的对象创建方式,JavaScript还提供了其他方法创建对象.1).使用工厂函数创建对象我们可以编写一个函数,此函数的功能就是创建对象,可将其. 概述 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法. 然而,除了这两种常用的对象创建方式,JavaScript还提

JavaScript构造函数详解_javascript技巧

构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象.   构造函数注意事项: 1.默认函数首字母大写 2.构造函数并没有显示返回任何东西.new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型. 3.也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回.如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回.     function Person( name)

C++友元函数与拷贝构造函数详解_C 语言

一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数. 友元函数和普通函数的定义一样;在类内必须将该普通函数声明为友元. (2)友元函数不是成员函数. 不能通过对象来调用,而是直接调用;友元函数可以访问类的公有.受保护以及私有成员,但是必须通过对象.对象指针或者对象引用来访问. 2.友元函数的声明: friend 返回值类型 函数名(参数表); 在类中只需要将这个声明放置在公有部分即可. class Point { double x, y; public: Point(){

c++类构造函数详解

  这篇文章主要介绍了c++类构造函数示例,需要的朋友可以参考下        代码如下: //一. 构造函数是干什么的 /* 类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作 eg: Counter c1; 编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象,初始化之后c1的m_value值设置为0 故:构造函数的作用:初始化对象的数据成员.*/ class Counter { pu

Java 重载、重写、构造函数详解

方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定义某个子类型特有的行为. class Animal { public void eat(){ 2.对于从父类继承来的抽象方法,要么在子类用重写的方式设计该方法,要么把子类也标识为抽象的.所以抽象方法可以说是必须要被重写的方法. 3.重写的意义. 重写方法可以实现多态,用父类的引用来操纵子类对象,但是在实际运行中对象将运行其自己特有的方法.

C++拷贝构造函数详解

转自:http://blog.csdn.net/lwbeyond/article/details/6202256 对于一个空类,编译器默认生成四个成员函数:默认构造函数.析构函数.拷贝构造函数.赋值函数: 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. 1 #include <iostream> 2 us

c++类构造函数详解_C 语言

复制代码 代码如下: //一. 构造函数是干什么的 /*   类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作     eg: Counter c1;      编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象,初始化之后c1的m_value值设置为0      故:构造函数的作用:初始化对象的数据成员.*/       class Counter       {      publ

Android自定义View构造函数详解

初始Custom View的构造函数 之前写过一篇实现圆形进度条的博客(自定义圆形进度条),通常我们在实现Custom View的时候,都会先继承View并实现View的三个构造函数,例如: import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; public class MyCustomView exte

Javascript 构造函数详解_基础知识

一.什么是构造函数 在一些面向对象的语言,如Java.C++.PHP中,构造函数是很常见的.在Javascript中构造函数首先是一个普通的函数,它可以使用new 操作符来调用,并生成一个特殊类型的对象. 复制代码 代码如下: // "Benjamin" is a constructor var benjamin = new Benjamin("zuojj", "male"); 在上面这个实例中benjamin是一个Benjamin对象,那么它是