【问题标题】:What is the purpose of public, protection, private on class diagram? Any examples?类图上公共、保护、私有的目的是什么?有什么例子吗?
【发布时间】:2017-12-28 10:01:39
【问题描述】:


我一直对访问修饰符很好奇。

public 表示该项目可供有权访问该对象的任何人使用,

protected 意味着它对对象本身和任何子类都可用,并且

private 表示只能在类本身内访问。

但是,我不知道公共、受保护和私有用例的示例。
我的意思是,谁能解释一下类图中公共、私有和受保护的访问修饰符的情况?
只是为了确保我正确理解它们。

谢谢!

【问题讨论】:

  • 这些 (Java) 访问类型与 MySQL 或数据库有什么关系?
  • 数据库@TimBiegeleisen

标签: java php private public protected


【解决方案1】:

确实不仅有 3 种访问类型,在不同的语言中还有更多。
例如:

  1. public – 使用此访问修饰符定义的类或其成员可以从任何地方公开访问,甚至可以从类范围之外访问。
  2. private – 使用此关键字的类成员将在类本身内访问。它通过类实例的引用保护成员免受外部类访问。
  3. protected – 与 private 相同,但允许子类访问受保护的超类成员。
  4. abstract – 此关键字只能用于 PHP 类及其函数。为了包含抽象函数,PHP 类应该是一个抽象类。
  5. final - 防止子类覆盖用 final 关键字定义的超类成员。
  6. internal - 可以在包含其声明的程序内访问,也可以在同一程序集级别内访问,但不能从另一个程序集访问。
  7. 受保护的内部 - 受保护和内部的访问级别相同。它可以访问同一程序集和同一类中的任何位置,也可以访问从同一类继承的类

其中一些适用于类,一些适用于函数,另一些适用于变量。
因此,在大多数语言中,所有类成员都以 public 访问类型声明(例如 Java 除外)。

回到主要问题。
所有这些访问修饰符的应用都是为了方便组件的封装。

在 C++ 中使用此类访问修饰符的简单示例 (taken from here):

#include <iostream>
#include<conio.h>
using std::cout;
using std::endl;

struct B { // default access modifier inside struct is public
    void set_n(int v) { n = v; }
    void f()          { cout << "B::f" << endl; }
  protected:
    int m, n; // B::m, B::n are protected
  private:
    int x;
};

struct D : B {
    using B::m;               // D::m is public
    int get_n() { return n; } // B::n is accessible here, but not outside
//  int get_x() { return x; } // ERROR, B::x is inaccessible here
 private:
    using B::f;               // D::f is private
};

int main() {
    D d;

//  d.x = 2; // ERROR, private
//  d.n = 2; // ERROR, protected
    d.m = 2; // protected B::m is accessible as D::m

    d.set_n(2); // calls B::set_n(int)
    cout << d.get_n() << endl; // output: 2

//  d.f();   // ERROR, B::f is inaccessible as D::f


    B& b = d; // b references d and "views" it as being type B

//  b.x = 3; // ERROR, private
//  b.n = 3; // ERROR, protected
//  b.m = 3; // ERROR, B::m is protected

    b.set_n(3); // calls B::set_n(int)
//  cout << b.get_n(); // ERROR, 'struct B' has no member named 'get_n'

    b.f();   // calls B::f()
    return 0;
}

所以,要理解这个修饰符的用途,首先你必须理解面向对象编程的核心原理,尤其是封装范式。
这不是简单的示例代码就能轻松解释的事情。
修饰符只是庞大的 OOP 世界的一小部分。

【讨论】:

    【解决方案2】:

    基本上,您使用 Public、private、protected 和其他访问修饰符关键字来控制对类成员的访问。 例如,您希望变量或方法仅在类内部用于内部目的,但该成员不应该在类外部看到,那么您应该使用“Private”访问修饰符关键字声明它。

    另一方面,“Public”用于声明应从类外部访问的成员,构造函数是为什么应使用“Public”关键字声明它们的明确示例。其他成员,例如执行有用任务的方法,如 (.ToString, .Substring) 也是应该声明为 public 的成员的好例子,简而言之,它们可以从类外部使用,并对使用您的类的任何人执行有用的任务.

    考虑一下:

    class employee
    {
    private int instanceCount = 0;
    private string empName;
    
    public employee(string fname, string lname)
    {
    //Provide some code for the constructor.
    empname = fname + " " + lname;
    instanceCount ++;}
    }
    

    很明显,构造函数应该是公共的,而用于计算实例数量的“instanceCount”变量是私有的。

    对于protected,所有适用于private的东西也适用于protected,只是略有不同,protected可以被继承类使用,private不能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 2012-04-10
      • 2010-11-04
      • 2014-03-21
      • 2014-09-14
      相关资源
      最近更新 更多