久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 代碼封(feng)裝是為了什么 怎么封(feng)裝

代碼封(feng)裝是(shi)為了什么 怎么封(feng)裝 時間:2018-08-14      來源:未知(zhi)

很多程序員小白在(zai)剛剛踏入職場,做(zuo)程序開發工作(zuo)的時候,經常會被項目(mu)經理叫去喝茶(cha)。

小白,你寫的(de)這代(dai)碼耦合太嚴(yan)重啦,簡直沒有設計可(ke)言(yan),更不要(yao)說擴展(zhan)性和(he)靈活性,所有的(de)功能(neng)(neng)都(dou)定義在一(yi)個(ge)類里,這樣隨著功能(neng)(neng)的(de)增(zeng)多(duo),代(dai)碼就越來(lai)越復雜。你趕緊把代(dai)碼拆分一(yi)下,各(ge)功能(neng)(neng)進行一(yi)下代(dai)碼封裝。

1那什(shen)么是封裝呢?

封裝,在(zai)C語言(yan)編程中,大部分時候用(yong)(yong)一(yi)個函(han)數(shu)調用(yong)(yong)(API)將(jiang)一(yi)個復雜過程的細節(jie)屏(ping)蔽起(qi)來,用(yong)(yong)戶不(bu)需(xu)要了(le)解(jie)細節(jie),只需(xu)要調用(yong)(yong)該函(han)數(shu)就(jiu)能實現相應的行為(wei)。例如吃(chi)飯函(han)數(shu),將(jiang)盛飯,動(dong)筷子(zi),夾(jia)菜(cai),張嘴,咀嚼,下咽等細節(jie)屏(ping)蔽起(qi)來,我們只需(xu)要調用(yong)(yong)吃(chi)飯函(han)數(shu),默認就(jiu)實現了(le)一(yi)遍(bian)這樣的流(liu)程。

面向對(dui)(dui)(dui)象思想中(zhong)的(de)封(feng)裝(zhuang)使用更廣泛,即一個對(dui)(dui)(dui)象類(lei)(C語言中(zhong)用結構(gou)體代替(ti)),需(xu)要隱藏用戶不(bu)需(xu)要也不(bu)應該(gai)知(zhi)道的(de)行為(wei)和屬(shu)性。用戶在訪問對(dui)(dui)(dui)象時(shi),不(bu)需(xu)要了解被封(feng)裝(zhuang)的(de)對(dui)(dui)(dui)象和屬(shu)性,就能使用該(gai)對(dui)(dui)(dui)象類(lei),同時(shi)對(dui)(dui)(dui)象類(lei)也應該(gai)通過(guo)權限設(she)置,禁(jin)止用戶過(guo)多(duo)地了解被封(feng)裝(zhuang)的(de)對(dui)(dui)(dui)象屬(shu)性與行為(wei)。

封裝的思(si)想都是為了讓用(yong)(yong)戶不需要了解(jie)對(dui)象過多的細節,就能直接通過API來使用(yong)(yong)對(dui)象,從而達到模塊(kuai)化(hua)編程,程序員(yuan)分工合作,各自(zi)負責維(wei)護(hu)自(zi)己負責模塊(kuai)對(dui)象細節的作用(yong)(yong)。這個原則(ze)普(pu)遍存在于現(xian)實生活中,在軟(ruan)件開發領域(yu)也始終(zhong)提倡著。

2為什么要進行代碼封裝?

我(wo)們(men)(men)寫程序(xu)是用來解(jie)決(jue)問(wen)題(ti)(ti)(ti)的(de)(de),而(er)(er)且要(yao)解(jie)決(jue)的(de)(de)是現(xian)(xian)實(shi)中的(de)(de)問(wen)題(ti)(ti)(ti),所以(yi)我(wo)們(men)(men)需要(yao)將現(xian)(xian)實(shi)問(wen)題(ti)(ti)(ti)轉(zhuan)化為符號化的(de)(de)問(wen)題(ti)(ti)(ti),而(er)(er)現(xian)(xian)實(shi)中的(de)(de)問(wen)題(ti)(ti)(ti)是由個(ge)體所組(zu)成的(de)(de),所以(yi)我(wo)們(men)(men)將數(shu)據(ju)和處(chu)(chu)理數(shu)據(ju)的(de)(de)方(fang)法封裝起來形成一(yi)個(ge)個(ge)體,這個(ge)個(ge)體在問(wen)題(ti)(ti)(ti)里(li)面有(you)專門的(de)(de)功能,比如(ru)一(yi)張(zhang)紙(zhi)可(ke)以(yi)折(zhe)疊,一(yi)支筆可(ke)以(yi)寫,這樣有(you)助于(yu)我(wo)們(men)(men)以(yi)自(zi)身的(de)(de)角度進行(xing)思(si)考分析(xi),這就是面向(xiang)(xiang)對象。如(ru)果(guo)用面向(xiang)(xiang)過程的(de)(de)思(si)路,會導(dao)致問(wen)題(ti)(ti)(ti)與(yu)程序(xu)之間(jian)的(de)(de)轉(zhuan)化不好處(chu)(chu)理,可(ke)能使解(jie)決(jue)問(wen)題(ti)(ti)(ti)出現(xian)(xian)偏差(cha)。

封(feng)裝(zhuang)(zhuang)的(de)(de)(de)(de)過(guo)程,其(qi)實(shi)就是對(dui)(dui)(dui)事(shi)物進(jin)(jin)行抽象(xiang)的(de)(de)(de)(de)過(guo)程,也是對(dui)(dui)(dui)事(shi)物進(jin)(jin)行認識的(de)(de)(de)(de)過(guo)程,我(wo)們(men)從開(kai)始到(dao)現在,封(feng)裝(zhuang)(zhuang)的(de)(de)(de)(de)層次越(yue)來(lai)越(yue)深,處(chu)理的(de)(de)(de)(de)問題也越(yue)來(lai)越(yue)復(fu)(fu)雜(za)。因為我(wo)們(men)需(xu)要理清復(fu)(fu)雜(za)問題的(de)(de)(de)(de)內部規律,從而(er)找出解(jie)(jie)決(jue)問題的(de)(de)(de)(de)辦(ban)法(fa),而(er)深層次的(de)(de)(de)(de)封(feng)裝(zhuang)(zhuang)使問題恢復(fu)(fu)成(cheng)本來(lai)的(de)(de)(de)(de)樣(yang)子就是一種(zhong)解(jie)(jie)決(jue)辦(ban)法(fa)。所以(yi)說封(feng)裝(zhuang)(zhuang)是在面對(dui)(dui)(dui)軟件復(fu)(fu)雜(za)度(du)增加,開(kai)發過(guo)程中遇(yu)到(dao)各種(zhong)瓶(ping)頸時(shi),為了解(jie)(jie)決(jue)這些問題而(er)提出的(de)(de)(de)(de),通過(guo)封(feng)裝(zhuang)(zhuang)可以(yi)達到(dao)模塊化編程,程序員分工合作(zuo),各自負責維護自己負責模塊對(dui)(dui)(dui)象(xiang)細節的(de)(de)(de)(de)作(zuo)用(yong)。當封(feng)裝(zhuang)(zhuang)的(de)(de)(de)(de)程度(du)達到(dao)了一定的(de)(de)(de)(de)水平,就是面向對(dui)(dui)(dui)象(xiang)的(de)(de)(de)(de)程序設計(ji)思(si)想。

3什么是(shi)面(mian)(mian)向(xiang)對象(xiang)思想,和面(mian)(mian)向(xiang)過程有什么不同?

所謂(wei)面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)的(de)(de)(de)(de)(de)思想其實就是(shi)(shi)一種在(zai)代碼編(bian)寫(xie)之上的(de)(de)(de)(de)(de)軟(ruan)件(jian)(jian)(jian)系(xi)統(tong)結構設(she)(she)(she)計(ji)的(de)(de)(de)(de)(de)思想,和語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)無關,并不是(shi)(shi)C++或者(zhe)JAVA 、Python等語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)才(cai)有(you)的(de)(de)(de)(de)(de)。面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)思想,是(shi)(shi)隨著軟(ruan)件(jian)(jian)(jian)系(xi)統(tong)的(de)(de)(de)(de)(de)復(fu)雜度越來越高,面(mian)(mian)(mian)(mian)對大規(gui)模(mo)(mo)軟(ruan)件(jian)(jian)(jian)系(xi)統(tong)設(she)(she)(she)計(ji)的(de)(de)(de)(de)(de)問題(ti)(ti)(ti),而(er)(er)提(ti)(ti)出(chu)的(de)(de)(de)(de)(de)一種管理大型(xing)軟(ruan)件(jian)(jian)(jian)系(xi)統(tong)設(she)(she)(she)計(ji)的(de)(de)(de)(de)(de)思想。只是(shi)(shi)在(zai)C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)出(chu)現(xian)時,計(ji)算機軟(ruan)硬件(jian)(jian)(jian)系(xi)統(tong)還在(zai)起步階(jie)段,面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)的(de)(de)(de)(de)(de)思想尚未發展,因而(er)(er)C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)中缺(que)乏面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)相(xiang)關的(de)(de)(de)(de)(de)核心(xin)(xin)關鍵詞語(yu)(yu)(yu)(yu)(yu)法的(de)(de)(de)(de)(de)支(zhi)持。而(er)(er)JAVA、Python等一些(xie)(xie)1990年(nian)代之后問世的(de)(de)(de)(de)(de)語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan),受到(dao)C++語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)影響以(yi)及面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)思想的(de)(de)(de)(de)(de)逐漸(jian)流行,在(zai)語(yu)(yu)(yu)(yu)(yu)法層面(mian)(mian)(mian)(mian)就提(ti)(ti)供了(le)面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)的(de)(de)(de)(de)(de)核心(xin)(xin)關鍵詞支(zhi)持,可(ke)以(yi)說在(zai)處理面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)問題(ti)(ti)(ti)上具有(you)先天優勢(shi)。雖然C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)不支(zhi)持很多面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)的(de)(de)(de)(de)(de)核心(xin)(xin)關鍵詞,但是(shi)(shi)隨著Linux內(nei)核,Ffmpeg,Nginx等大規(gui)模(mo)(mo)以(yi)C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)編(bian)寫(xie)的(de)(de)(de)(de)(de)開源軟(ruan)件(jian)(jian)(jian)項(xiang)目的(de)(de)(de)(de)(de)發展與推廣,C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)遇(yu)(yu)到(dao)的(de)(de)(de)(de)(de)軟(ruan)件(jian)(jian)(jian)復(fu)雜度增加以(yi)及系(xi)統(tong)設(she)(she)(she)計(ji)與系(xi)統(tong)長期維護的(de)(de)(de)(de)(de)問題(ti)(ti)(ti),與JAVA、C++編(bian)程(cheng)遇(yu)(yu)到(dao)的(de)(de)(de)(de)(de)復(fu)雜度問題(ti)(ti)(ti)是(shi)(shi)想通的(de)(de)(de)(de)(de)。并且,面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)思想也是(shi)(shi)由于開發者(zhe)們(men)在(zai)開發過程(cheng)中遇(yu)(yu)到(dao)瓶頸才(cai)提(ti)(ti)出(chu)來的(de)(de)(de)(de)(de),這些(xie)(xie)問題(ti)(ti)(ti),不管是(shi)(shi)用(yong)C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)編(bian)程(cheng)還是(shi)(shi)JAVA編(bian)程(cheng),都(dou)會(hui)客觀存在(zai)。因而(er)(er)用(yong)C語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan)模(mo)(mo)擬(ni)JAVA等面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)的(de)(de)(de)(de)(de)語(yu)(yu)(yu)(yu)(yu)言(yan)(yan)(yan)(yan)(yan),采用(yong)面(mian)(mian)(mian)(mian)向(xiang)對象(xiang)(xiang)的(de)(de)(de)(de)(de)思想進行系(xi)統(tong)頂層設(she)(she)(she)計(ji)是(shi)(shi)很有(you)必要(yao)的(de)(de)(de)(de)(de)。

面(mian)向過程(cheng)與(yu)面(mian)向對象的(de)思想(xiang)用(yong)途不同,沒(mei)有好壞(huai)之分(fen)。面(mian)向對象思想(xiang)更傾向于(yu)程(cheng)序(xu)之上的(de)頂層設(she)計與(yu)程(cheng)序(xu)系(xi)統結(jie)構設(she)計,然后真正(zheng)要(yao)(yao)實現(xian)一個函數細(xi)(xi)節的(de)時(shi)候(hou),還是需(xu)要(yao)(yao)面(mian)向過程(cheng)地(di)分(fen)析細(xi)(xi)節如何實現(xian),需(xu)要(yao)(yao)初始化(hua)哪(na)些變量,注冊哪(na)些結(jie)構,設(she)置哪(na)些寄存器等面(mian)向過程(cheng)的(de)問題。

4在C語言(yan)中實現面向(xiang)對象的(de)思想

既然面向對象是種思想,任何語言(yan)都可(ke)以實現,而且(qie)這(zhe)種思想重要的幾個特性是封裝,繼承,多態(tai)。那在(zai)C語言(yan)中(zhong)如何實現呢?

在正(zheng)式(shi)介(jie)紹C語(yu)言實現(xian)封裝,繼承和(he)多態(tai)事前,先(xian)介(jie)紹一下C語(yu)言中的幾個概念和(he)語(yu)法。

4.1基(ji)本知識

(1)結構體

在C語言中,常把一(yi)個對(dui)象用(yong)結(jie)構(gou)體進行封裝,這(zhe)樣便于(yu)對(dui)對(dui)象進行操作,比(bi)如:

strcut Point{

int x;

int y;

};

 結(jie)(jie)構(gou)(gou)體(ti)可以嵌套。因而(er)可以把一(yi)個(ge)(ge)結(jie)(jie)構(gou)(gou)體(ti)當(dang)成(cheng)另一(yi)個(ge)(ge)結(jie)(jie)構(gou)(gou)體(ti)的成(cheng)員,如:

struct Circle {

struct Point point_;

int radius;

};

該結構體與以(yi)下(xia)定義完全一樣(包括內存布置都一樣):

struct Circle {

int x;

int y;

int radius;

};

(2)函數指針

函(han)(han)數(shu)(shu)(shu)指(zhi)針(zhen)是指(zhi)針(zhen)的一種,它指(zhi)向函(han)(han)數(shu)(shu)(shu)的首地(di)址(函(han)(han)數(shu)(shu)(shu)的函(han)(han)數(shu)(shu)(shu)名即為函(han)(han)數(shu)(shu)(shu)的首地(di)址),可以通過函(han)(han)數(shu)(shu)(shu)指(zhi)針(zhen)來調(diao)用函(han)(han)數(shu)(shu)(shu)。

如函數:

int func(int a[], int n);

可以這樣聲明函數指針:

int (*pFunc)(int a[], int n);

這樣使用:

pFunc = func;

(*pFunc)(a, n);【或者PFunc(a, n)】

可以(yi)用typedef定義(yi)一(yi)個函數指針類型,如:

typdef int (*FUNC)(int a[], int n)

可以(yi)這樣使用(yong):

int cal_a(FUNC fptr, int a[], int n)

{

//實現體

}

(3)extern與static

extern和static是C語(yu)言中(zhong)的兩個修飾符,extern可用(yong)于(yu)修飾函(han)(han)數或(huo)者(zhe)(zhe)變量,表示(shi)該變量或(huo)者(zhe)(zhe)函(han)(han)數在(zai)其他文件(jian)中(zhong)進(jin)行了定義;static也可用(yong)于(yu)修飾函(han)(han)數或(huo)者(zhe)(zhe)變量,表示(shi)該函(han)(han)數或(huo)者(zhe)(zhe)變量只能(neng)在(zai)該文件(jian)中(zhong)使用(yong)。可利用(yong)它們對數據或(huo)者(zhe)(zhe)函(han)(han)數進(jin)行隱(yin)藏或(huo)者(zhe)(zhe)限(xian)(xian)制訪問權(quan)限(xian)(xian)。

4.2封裝

在(zai)C語言中,可以用結構+函數(shu)指針來模(mo)擬類的(de)(de)實現(xian),而用這種結構定義的(de)(de)變量就是對(dui)象。封(feng)(feng)裝的(de)(de)主(zhu)要含義是隱藏內部的(de)(de)行為和(he)信(xin)息,使用者只用看到對(dui)外提供(gong)的(de)(de)接口(kou)和(he)公開的(de)(de)信(xin)息。有兩種方法(fa)實現(xian)封(feng)(feng)裝:

(1) 利用C語言(yan)語法。在(zai)頭文(wen)件中聲明(ming),在(zai)C文(wen)件中真正定義它(ta)。

這樣可以隱藏內部信息,因為外部不知道對象所占內存的大小,所以不能靜態的創建該類的對象,只能調用類提供的創建函數才能創建。這種方法的缺陷是不支持繼承,因為子類中得不到任何關于父類的信息。如:
//頭文件:point.h
  #ifndef POINT_H
  #define POINT_H
  struct Point;
  typedef struct Point point;
  point * new_point(); //newer a point object
void free_point(point *point_);// free the allocated space
#endif
//C文件:point.c
#include”point.h”
strcut Point
 {
  int x;
  int y;
};
point * new_point()
{
point * new_point_ = (point *) malloc(sizeof(point));
return new_point_;
}
void free_point(point *point_)
{
if(point_ == NULL)
return;
free(point_);
}

(2) 把私有數據信息放(fang)在一(yi)個不透明的(de)priv變量或(huo)者結構(gou)(gou)體中。只有類的(de)實現代碼才知道priv或(huo)者結構(gou)(gou)體的(de)真正(zheng)定義。如:

#ifndef POINT _H

#define POINT_H

typedef struct Point point;

typedef struct pointPrivate pointPrivate;

strcut Point

{

Struct pointPrivate *pp;

};

int get_x(point *point_);

int get_y(point *point_);

point * new_point(); //newer a point object

void free_point(point *point_);// free the allocated space

#endif

//C文件:point.c

#include”point.h”

struct pointPrivate

{

int x;

int y;

}

int get_x(point *point_)

{

return point_->pp->x;

}

int get_y(point *point_)

{

return point_->pp->y;

}

//others…..

4.3繼承

在C語言(yan)中(zhong),可以(yi)利用(yong)“結構在內存中(zhong)的布局與結構的聲明具有(you)一致的順序(xu)”這一事實實現(xian)繼(ji)承。

比如我們要設計一(yi)個作圖工(gong)具,其中(zhong)可(ke)(ke)能涉(she)及到的對象有(you)Point(點),Circle(圓),由(you)于圓是由(you)點組成(cheng)的,所有(you)可(ke)(ke)以看成(cheng)Circle繼承自Point。另外(wai),Point和Circle都需要空間(jian)(jian)申請,空間(jian)(jian)釋放等操(cao)作,所有(you)他(ta)們有(you)共同的基類Base。

//內存管理類new.h
 #ifndef NEW_H
  #define NEW_H
  void * new (const void * class, ...);
  void delete (void * item);
  void draw (const void * self);
  #endif
  
//內存管理類的C文件:new.c
  #include “new.h”
  #include “base.h”
  void * new (const void * _base, ...)
  {
  const struct Base * base = _base;
  void * p = calloc(1, base->size);
  assert(p);
  * (const struct Base **) p = base;
if (base ->ctor)
  {
va_list ap;
va_start(ap, _base);
 p = base ->ctor(p, &ap);
  va_end(ap);
}
  return p;
}
 
void delete (void * self)
{
const struct Base ** cp = self;
if (self && * cp && (* cp) —> dtor)
self = (* cp) —>dtor(self);
free(self);
}
  
void draw (const void * self)
{
const struct Base * const * cp = self;
assert(self &&* cp && (* cp)->draw);
(* cp) ->draw(self);
}
  
//基類:base.h
#ifndef BASE_H
#define BASE_H
struct Base
{
size_t size; //類所占空間
void * (* ctor) (void * self, va_list * app); //構造函數
void * (* dtor) (void * self); //析構函數
void (* draw) (const void * self); //作圖
};
#endif
 
//Point頭文件(對外提供的接口):point.h
#ifndef   POINT_H
  
#define  POINT_H
extern const void * Point;                /* 使用方法:new (Point, x, y); */
#endif
 
//Point內部頭文件(外面看不到):point.r
#ifndef POINT_R
#define POINT_R
struct Point
{
const void * base; //繼承,基類指針,放在第一個位置,const是防止修改
int x, y;        //坐標
}
#endif
  
//Point的C文件:point.c
#include “point.h”
#include “new.h”
#include “point.h”
#include “point.r”
static void * Point_ctor (void * _self, va_list * app)
{
struct Point * self = _self;
self ->x = va_arg(* app, int);
self ->y = va_arg(* app, int);
return self;
}
  
static void Point_draw (const void * _self)
{
const struct Point * self = _self;
printf(“draw (%d,%d)”, self -> x, self -> y);
}
static const struct Base _Point = {
sizeof(struct Point), Point_ctor, 0, Point_draw
};
const void * Point = & _Point;
  
//測試程序:main.c
#include “point.h”
#include “new.h”
int main (int argc, char ** argv)
{
void * p = new(Point, 1, 2);
draw(p);
delete(p);
}

同樣,Circle要(yao)繼承Point,則可以這樣:

struct Circle

{

const struct Point point; //放在(zai)第一位,可(ke)表繼承(cheng)

int radius;

};

4.3多態

可以是用C語言中的萬能指針void* 實現(xian)多態,接(jie)上面的例子:

//測試(shi)main.c

void * p = new(Point, 1, 2);

void * pp = new(Circle, 1, 2);

draw(p); //draw函數實現了多態(tai)

draw(pp);

delete(p);

delete(pp);

C語(yu)言(yan)能夠模擬實(shi)(shi)現(xian)面向(xiang)對象(xiang)語(yu)言(yan)具有的特性,包(bao)括:多態,繼承,封裝等,現(xian)在(zai)很多開(kai)源軟(ruan)件都了(le)用C語(yu)言(yan)實(shi)(shi)現(xian)了(le)這幾個(ge)特性,包(bao)括大型開(kai)源數據(ju)庫系統postgreSQL,可(ke)移(yi)植的C語(yu)言(yan)面向(xiang)對象(xiang)框(kuang)架GObject,無線(xian)二進制運行環(huan)境BREW。采(cai)用C語(yu)言(yan)實(shi)(shi)現(xian)多態,繼承,封裝,能夠讓軟(ruan)件有更好(hao)的可(ke)讀性,可(ke)擴展性。

上一篇:硬件學習該從何下手

下一篇:gcc編譯器下載及安裝教程

熱點(dian)文章推薦
華清(qing)學員就業榜單
高薪學員經驗(yan)分享(xiang)
熱點新聞(wen)推(tui)薦
前(qian)臺專線:010-82525158 企(qi)業培訓洽(qia)談專(zhuan)線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部