The method * from the type * is not visible

本文深入探讨了Java中访问控制符protected的微妙之处,通过具体的代码示例解释了为何子类只能访问自身继承的protected成员,而无法访问同级其他子类的protected成员。
部署运行你感兴趣的模型镜像

一提到访问控制符protected,即使是初学者一般都会很自信的认为自己在这方面的理解没有问题。那好,我们提一个问题出来看看…

问题提出:
   请看下面两端代码,其中包B中的猫和鼠都继承了动物类。

package testa;    
public class Animal {    
    protected void crowl(String c){    
        System.out.println(c);    
    }    
}

代码2:

package testb;
import testa.Animal;

class Cat extends Animal 
{  
    
}  
public class Rat extends Animal{  
    public void crowl(){  
              this.crowl("zhi zhi"); //没有问题,继承了Animal中的protected方法——crowl(String)  
              Animal ani=new Animal();
              ani.crowl("animail jiaojiao"); //wrong, The method crowl(String) from the type Animal is not visible 
              Cat cat=new Cat();  
              cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible  
    }  
}

既然,猫和鼠都继承了动物类,那么在鼠类的作用范围内,看不到猫所继承的crowl()方法呢?

症结所在:
       protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域和父类对象的protectedani.crow1()说白了就是:老鼠只能"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫
       也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。

这就是为什么我们在用clone方法的时候不能简单的直接将对象aObject.clone()出来的原因了。而需要在aObject.bObject=(Bobject)this.bObject.clone();

      总之,当B extends A的时候,在子类B的作用范围内,只能调用本子类B定义的对象的protected方法(该方法从父类A中继承而来)。而不能调用其他A类(A 本身和从A继承)对象的protected方法

另外:同包内均和派生类中可比默认[default|package](只包内能使用) 权限大一点。

如把上面代码放到同一package 里就可以访问了。

package com;

import testa.Ani;
class Animail {  
    protected void crowl(String c){  
        System.out.println(c);  
    }  
}  
class Cat extends Animail{  
      
}  
public class Rat extends Animail{  
    public void crowl(){  
                crowl("zhi zhi"); //没有问题,继承了Animal中的protected方法——crowl(String) 
                Animail ani=new Animail();
                ani.crowl("animail jiaojiao");
                Cat cat=new Cat();  
                cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible  
              
    }
    
    public static void main(String[] args){
    	Rat rat=new Rat();
    	rat.crowl();
    }
} 
运行结果:
zhi zhi
animail jiaojiao
miao miao


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

WsfSensor WsfSensor inherits WsfArticulatedPart Static Methods static bool IsA_TypeOf(string aDerivedType, string aBaseType) Returns true if the sensor type specified by aDerivedType inherits from the sensor type specified by aBaseType (compare to WsfObject.IsA_TypeOf(aBaseType), which determines if a specific object inherits from aBaseType). This method can be used when one only knows the type of the sensor (as a string) and does not have a reference to the actual sensor. Methods bool TurnOff() Turns the sensor off and returns true if successful. bool TurnOn() Turns the sensor on and returns true if successful. int ModeCount() Returns the number of modes. int LaserCode() Returns the value of Laser Code this sensor will track or designate. (This value will remain ignored by many sensor types.) void SetLaserCode(int aValue) Sets the value of Laser Code this sensor will track or designate. (This value will remain ignored by many sensor types.) string ModeName(int aModeIndex) Returns the name of the mode located at the provided index. string CurrentMode() Returns the name of the current mode. Note This method is not valid for sensors that support simultaneous operation of multiple modes as defined by the selection_mode command in the sensor.Calling this method on such a sensor will return the string “<multi_select>”. void SelectMode(string aMode) Selects the specified mode and makes it the current mode. void DeselectMode(string aMode) Deselects the specified mode iff the sensor is a multiple_select sensor with multiple modes currently selected. Note This method is and does not operate (i.e. is not valid) for single select mode sensors or on a multi-select sensor with only one mode selected. int BeamCount() Returns the number of beams defined for the current sensor mode. Note If the sensor does not support beams, this method will return 0. int BeamCount(int aModeIndex) Returns the number of beams defined the mode of the given index. Note If the sensor does not support beams or the mode index is out-of-bounds, this method will return 0. int BeamCount(string aMode) Returns the number of beams defined the mode of the given name. Note If the sensor does not support beams or the mode of the given name is not defined, this method will return 0. double FrameTime() Return the frame time of the currently selected sensor mode. WsfFieldOfView FOV() Return the WsfFieldOfView associated with the sensor’s first defined receiver antenna for the current sensor mode. Note If no field of view exists, this method will abort. WsfFieldOfView FOV(int aIndex) Return the WsfFieldOfView associated with the receiver’s antenna on the sensor for the specified receiver index on the currently selected sensor mode. Note If no field of view exists for the specified receiver, this method will abort. WsfFieldOfView FOV(int aModeIndex, int aIndex) Return the WsfFieldOfView associated with the receiver’s antenna on the sensor for the specified receiver index and sensor mode. Note If no field of view exists for the specified mode and receiver, this method will abort. double FOV_MinimumAzimuth() double FOV_MaximumAzimuth() double FOV_MinimumElevation() double FOV_MaximumElevation() Returns the requested value from the definition of ‘field of view’ for the current mode as defined by azimuth_field_of_view and elevation_field_of_view. Note For multi-beam radars, this value will represent the largest extent from all beams. Note These methods are only valid when using the default rectangular field of view; otherwise, utilize WsfSensor.FOV. double FOV_MinimumRange() double FOV_MaximumRange() Returns the requested value from the definition of minimum_range and maximum_range. Note For multi-beam radars, this value will represent the largest extent from all beams. void SetFOV(WsfFieldOfView aFOV) Sets the field of view on all the sensor’s active receivers. void SetFOV(WsfFieldOfView aFOV, int aReceiverNumber) Sets the field of view on the specified receiver. Note The receiver upon which the field of view is set is accessed by the one parameter WsfSensor.Rcvr method. void SetFOV(WsfFieldOfView aFOV, int aModeNumber, int aReceiverNumber) Sets the field of view on the specified receiver with the given mode number. Note The receiver upon which the field of view is set is accessed by the two parameter WsfSensor.Rcvr method. void SetFOV_Azimuth(double aMinimumAzimuth, double aMaximumAzimuth) void SetFOV_Elevation(double aMinimumElevation, double aMaximumElevation) Sets the azimuth or elevation field of view for the sensor’s active receivers. If a sensor has more than one active receiver, these methods will modify each one. Note These methods are only valid when the active receivers use the default rectangular field of view; otherwise, utilize WsfSensor.SetFOV. void SetFOV_Range(double aMinimumRange, double aMaximumRange) Sets range limits associated with the field of view such that targets are not detected outside those limits. If a sensor has more than one active receiver, this method will modify each one. Note Calling this method has the same effect as providing the antenna minimum_range and maximum_range commands. bool CanScanInAzimuth() bool CanScanInElevation() Returns true if the current mode can scan in the requested direction, as defined by the scan_mode command. Note For multi-beam radars, the return value will be true if any beam can scan in the requested direction. double ScanMinimumAzimuth() double ScanMaximumAzimuth() double ScanMinimumElevation() double ScanMaximumElevation() Returns the requested value from the definition of the ‘scan volume’ for the current mode as defined by azimuth_scan_limits and elevation_scan_limits. Note The return value will be zero if the scan_mode do not indicate that scanning is allowed in the requested direction. Note For multibeam radars, this value will represent the largest extent from all beams. bool WithinFieldOfView(WsfGeoPoint aPoint) Returns true if the specified point is within the range and field of view limits of the current mode of the sensor. If the sensor is cued, the range and field of view are with respect to the cue. int ActiveTrackCount() Returns the current number of objects the sensor is tracking. int MaximumTrackCount() Returns the maximum number of objects the sensor can track. double TrackQuality() double TrackQuality(string aMode) double TrackQuality(int aModeIndex) Returns the track quality associated with a sensor mode. The first form returns the quality for the current sensor mode, while the remaining two return the quality for the mode corresponding to the specified name or index. Note These methods return -1.0 when the mode does not exist, and 0.5 if the mode exists but the track quality was not otherwise defined. int MaximumRequestCount(string aMode) int MaximumRequestCount() Returns the maximum number of track requests. The first form returns the count for the specified mode while the second form returns the sum of the counts for all modes. int ActiveRequestCount(string aMode) int ActiveRequestCount() Returns the current number of active track requests. The first form returns the count for the specified mode while the second form returns the sum of the counts for all modes. bool HaveRequestFor(WsfTrackId aTrackId) Returns ‘true’ if a StartTracking request is active for the specified track ID. bool StartTracking(WsfTrack aTrack, string aMode) Starts (or continues) tracking the given track using the specified sensor mode. Returns true if successful. bool StopTracking(WsfTrackId aTrackId) Stops tracking the track with the given track id. Returns true if successful. WsfEM_Xmtr Xmtr(int aIndex) WsfEM_Xmtr Xmtr(int aModeIndex, int aIndex) Returns the transmitter object on the sensor at the specified index or mode index and index if supplied. Note Check the returned transmitter for validity before using. int XmtrCount() int XmtrCount(int aModeIndex) Returns the transmitter count on the sensor for all modes or at the mode index if supplied. WsfEM_Rcvr Rcvr(int aIndex) WsfEM_Rcvr Rcvr(int aModeIndex, int aIndex) Returns the receiver object on the sensor at the specified index or mode index and index if supplied. Note Check the returned receiver for validity before using. int RcvrCount() int RcvrCount(int aModeIndex) Returns the receiver count on the sensor for all modes or at the mode index if supplied. Military Specific Electronic Warfare Methods Note WSF_TASK_PROCESSOR (WsfTaskManager) also has a StartTracking method. When using a task manager, you should use its StartTracking and StopTracking methods to control sensor operations as it provides additional capabilities. Note WSF_TASK_PROCESSOR (WsfTaskManager) also has a StopTracking method. When using a task manager,you should use its StartTracking and StopTracking methods to control sensor operations as it is provides additional capabilities. bool JammingPerceived(string aMode) bool JammingPerceived() Returns true if the sensor (operator) perceives jamming as defined by the jamming_perception_threshold and jamming_perception_timeout. Note This method is only valid for sensors deriving from type WSF_RADAR_SENSOR. bool ContinuousJammingPerceived(string aMode) bool ContinuousJammingPerceived() Returns true if the sensor (operator) perceives continuous (i.e., noise) type jamming as defined by the jamming_perception_threshold and jamming_perception_timeout. Note This method is only valid for sensors deriving from type WSF_RADAR_SENSOR. bool PulseJammingPerceived(string aMode) bool PulseJammingPerceived() Returns true if the sensor (operator) perceives pulse type jamming as defined by the jamming_perception_threshold and jamming_perception_timeout. Note This method is only valid for sensors deriving from type WSF_RADAR_SENSOR. bool IsEP_TechniqueActive(string aTechniqueName, string aMode) bool IsEP_TechniqueActive(string aTechniqueName) Is the technique with supplied name currently in use (i.e., turned on) for the specified mode if included? Returns true if it is in use and false otherwise. Note If no mode is specified current mode is assumed. Note The EP technique active check will be for all beams on the specified/current mode. If any of the beams are active true will be returned. bool SelectEP_Technique(string aTechniqueName, string aMode) bool SelectEP_Technique(string aTechniqueName) Selects the technique with supplied name to use (i.e., turns on) on the specified mode, if included. Returns true if successful and false otherwise. Note If no mode is specified current mode is assumed. Note The EP technique will be selected for all beams on the specified/current mode. bool DeselectEP_Technique(string aTechniqueName, string aMode) bool DeselectEP_Technique(string aTechniqueName) Deselects the technique with supplied name to use (i.e., turns on) on the specified mode, if included. Returns true if successful. Note If no mode is specified current mode is assumed. Note The EP technique will be deselected for all beams on the specified/current mode. 以上关于WsfSensor的解释中是否有返回探测目标的方法
08-01
/* * Copyright (C) 2011-2014 Felix Fietkau <nbd@openwrt.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef __LIBUBUS_H #define __LIBUBUS_H #ifdef __cplusplus extern "C" { #endif #include <libubox/avl.h> #include <libubox/list.h> #include <libubox/blobmsg.h> #include <libubox/uloop.h> #include <stdint.h> #include "ubusmsg.h" #include "ubus_common.h" #define UBUS_MAX_NOTIFY_PEERS 16 struct ubus_context; struct ubus_msg_src; struct ubus_object; struct ubus_request; struct ubus_request_data; struct ubus_object_data; struct ubus_event_handler; struct ubus_subscriber; struct ubus_notify_request; struct ubus_msghdr_buf { struct ubus_msghdr hdr; struct blob_attr *data; }; typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv); typedef int (*ubus_handler_t)(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg); typedef void (*ubus_state_handler_t)(struct ubus_context *ctx, struct ubus_object *obj); typedef void (*ubus_remove_handler_t)(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id); typedef void (*ubus_event_handler_t)(struct ubus_context *ctx, struct ubus_event_handler *ev, const char *type, struct blob_attr *msg); typedef void (*ubus_data_handler_t)(struct ubus_request *req, int type, struct blob_attr *msg); typedef void (*ubus_fd_handler_t)(struct ubus_request *req, int fd); typedef void (*ubus_complete_handler_t)(struct ubus_request *req, int ret); typedef void (*ubus_notify_complete_handler_t)(struct ubus_notify_request *req, int idx, int ret); typedef void (*ubus_notify_data_handler_t)(struct ubus_notify_request *req, int type, struct blob_attr *msg); typedef void (*ubus_connect_handler_t)(struct ubus_context *ctx); typedef bool (*ubus_new_object_handler_t)(struct ubus_context *ctx, struct ubus_subscriber *sub, const char *path); #define UBUS_OBJECT_TYPE(_name, _methods) \ { \ .name = _name, \ .id = 0, \ .methods = _methods, \ .n_methods = ARRAY_SIZE(_methods) \ } #define __UBUS_METHOD_BASE(_name, _handler, _mask, _tags) \ .name = _name, \ .handler = _handler, \ .mask = _mask, \ .tags = _tags #define __UBUS_METHOD_NOARG(_name, _handler, _mask, _tags) \ __UBUS_METHOD_BASE(_name, _handler, _mask, _tags), \ .policy = NULL, \ .n_policy = 0 #define __UBUS_METHOD(_name, _handler, _mask, _policy, _tags) \ __UBUS_METHOD_BASE(_name, _handler, _mask, _tags), \ .policy = _policy, \ .n_policy = ARRAY_SIZE(_policy) #define UBUS_METHOD(_name, _handler, _policy) \ { __UBUS_METHOD(_name, _handler, 0, _policy, 0) } #define UBUS_METHOD_TAG(_name, _handler, _policy, _tags)\ { __UBUS_METHOD(_name, _handler, 0, _policy, _tags) } #define UBUS_METHOD_MASK(_name, _handler, _policy, _mask) \ { __UBUS_METHOD(_name, _handler, _mask, _policy, 0) } #define UBUS_METHOD_NOARG(_name, _handler) \ { __UBUS_METHOD_NOARG(_name, _handler, 0, 0) } #define UBUS_METHOD_TAG_NOARG(_name, _handler, _tags) \ { __UBUS_METHOD_NOARG(_name, _handler, 0, _tags) } #define UBUS_TAG_STATUS (1ul << 0) #define UBUS_TAG_ADMIN (1ul << 1) #define UBUS_TAG_PRIVATE (1ul << 2) struct ubus_method { const char *name; ubus_handler_t handler; unsigned long mask; unsigned long tags; const struct blobmsg_policy *policy; int n_policy; }; struct ubus_object_type { const char *name; uint32_t id; const struct ubus_method *methods; int n_methods; }; struct ubus_object { struct avl_node avl; const char *name; uint32_t id; const char *path; struct ubus_object_type *type; ubus_state_handler_t subscribe_cb; bool has_subscribers; const struct ubus_method *methods; int n_methods; }; struct ubus_subscriber { struct list_head list; struct ubus_object obj; ubus_handler_t cb; ubus_remove_handler_t remove_cb; ubus_new_object_handler_t new_obj_cb; }; struct ubus_event_handler { struct ubus_object obj; ubus_event_handler_t cb; }; struct ubus_context { struct list_head requests; struct avl_tree objects; struct list_head pending; struct uloop_fd sock; struct uloop_timeout pending_timer; uint32_t local_id; uint16_t request_seq; bool cancel_poll; int stack_depth; void (*connection_lost)(struct ubus_context *ctx); void (*monitor_cb)(struct ubus_context *ctx, uint32_t seq, struct blob_attr *data); struct ubus_msghdr_buf msgbuf; uint32_t msgbuf_data_len; int msgbuf_reduction_counter; union { struct { struct list_head auto_subscribers; struct ubus_event_handler auto_subscribe_event_handler; }; struct { ubus_handler_t request_handler; }; }; }; struct ubus_object_data { uint32_t id; uint32_t type_id; const char *path; struct blob_attr *signature; }; struct ubus_acl_key { const char *user; const char *group; const char *object; }; struct ubus_request_data { uint32_t object; uint32_t peer; uint16_t seq; struct ubus_acl_key acl; /* internal use */ bool deferred; int fd; int req_fd; /* fd received from the initial request */ }; struct ubus_request { struct list_head list; struct list_head pending; int status_code; bool status_msg; bool blocked; bool cancelled; bool notify; uint32_t peer; uint16_t seq; ubus_data_handler_t raw_data_cb; ubus_data_handler_t data_cb; ubus_fd_handler_t fd_cb; ubus_complete_handler_t complete_cb; int fd; struct ubus_context *ctx; void *priv; }; struct ubus_notify_request { struct ubus_request req; ubus_notify_complete_handler_t status_cb; ubus_notify_complete_handler_t complete_cb; ubus_notify_data_handler_t data_cb; uint32_t pending; uint32_t id[UBUS_MAX_NOTIFY_PEERS + 1]; }; struct ubus_auto_conn { struct ubus_context ctx; struct uloop_timeout timer; const char *path; ubus_connect_handler_t cb; }; struct ubus_context *ubus_connect(const char *path); int ubus_connect_ctx(struct ubus_context *ctx, const char *path); void ubus_auto_connect(struct ubus_auto_conn *conn); int ubus_reconnect(struct ubus_context *ctx, const char *path); int ubus_channel_connect(struct ubus_context *ctx, int fd, ubus_handler_t handler); int ubus_channel_create(struct ubus_context *ctx, int *remote_fd, ubus_handler_t handler); void ubus_flush_requests(struct ubus_context *ctx); static inline bool ubus_context_is_channel(struct ubus_context *ctx) { return ctx->local_id == UBUS_CLIENT_ID_CHANNEL; } /* call this only for struct ubus_context pointers returned by ubus_connect() */ void ubus_free(struct ubus_context *ctx); /* call this only for struct ubus_context pointers initialised by ubus_connect_ctx() */ void ubus_shutdown(struct ubus_context *ctx); static inline void ubus_auto_shutdown(struct ubus_auto_conn *conn) { uloop_timeout_cancel(&conn->timer); ubus_shutdown(&conn->ctx); } const char *ubus_strerror(int error); static inline void ubus_add_uloop(struct ubus_context *ctx) { uloop_fd_add(&ctx->sock, ULOOP_BLOCKING | ULOOP_READ); } /* call this for read events on ctx->sock.fd when not using uloop */ static inline void ubus_handle_event(struct ubus_context *ctx) { ctx->sock.cb(&ctx->sock, ULOOP_READ); } /* ----------- raw request handling ----------- */ /* wait for a request to complete and return its status */ int ubus_complete_request(struct ubus_context *ctx, struct ubus_request *req, int timeout); /* complete a request asynchronously */ void ubus_complete_request_async(struct ubus_context *ctx, struct ubus_request *req); /* abort an asynchronous request */ void ubus_abort_request(struct ubus_context *ctx, struct ubus_request *req); /* ----------- objects ----------- */ int ubus_lookup(struct ubus_context *ctx, const char *path, ubus_lookup_handler_t cb, void *priv); int ubus_lookup_id(struct ubus_context *ctx, const char *path, uint32_t *id); /* make an object visible to remote connections */ int ubus_add_object(struct ubus_context *ctx, struct ubus_object *obj); /* remove the object from the ubus connection */ int ubus_remove_object(struct ubus_context *ctx, struct ubus_object *obj); /* add a subscriber notifications from another object */ int ubus_register_subscriber(struct ubus_context *ctx, struct ubus_subscriber *obj); static inline int ubus_unregister_subscriber(struct ubus_context *ctx, struct ubus_subscriber *obj) { if (!list_empty(&obj->list)) list_del_init(&obj->list); return ubus_remove_object(ctx, &obj->obj); } int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id); int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id); int __ubus_monitor(struct ubus_context *ctx, const char *type); static inline int ubus_monitor_start(struct ubus_context *ctx) { return __ubus_monitor(ctx, "add"); } static inline int ubus_monitor_stop(struct ubus_context *ctx) { return __ubus_monitor(ctx, "remove"); } /* ----------- acl ----------- */ struct acl_object { struct ubus_acl_key key; struct avl_node avl; struct blob_attr *acl; }; extern struct avl_tree acl_objects; int ubus_register_acl(struct ubus_context *ctx); #define acl_for_each(o, m) \ if ((m)->object && (m)->user && (m)->group) \ avl_for_element_range(avl_find_ge_element(&acl_objects, m, o, avl), avl_find_le_element(&acl_objects, m, o, avl), o, avl) /* ----------- rpc ----------- */ /* invoke a method on a specific object */ int ubus_invoke_fd(struct ubus_context *ctx, uint32_t obj, const char *method, struct blob_attr *msg, ubus_data_handler_t cb, void *priv, int timeout, int fd); static inline int ubus_invoke(struct ubus_context *ctx, uint32_t obj, const char *method, struct blob_attr *msg, ubus_data_handler_t cb, void *priv, int timeout) { return ubus_invoke_fd(ctx, obj, method, msg, cb, priv, timeout, -1); } /* asynchronous version of ubus_invoke() */ int ubus_invoke_async_fd(struct ubus_context *ctx, uint32_t obj, const char *method, struct blob_attr *msg, struct ubus_request *req, int fd); static inline int ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *method, struct blob_attr *msg, struct ubus_request *req) { return ubus_invoke_async_fd(ctx, obj, method, msg, req, -1); } /* send a reply to an incoming object method call */ int ubus_send_reply(struct ubus_context *ctx, struct ubus_request_data *req, struct blob_attr *msg); static inline void ubus_defer_request(struct ubus_context *ctx, struct ubus_request_data *req, struct ubus_request_data *new_req) { (void) ctx; memcpy(new_req, req, sizeof(*req)); req->deferred = true; } static inline void ubus_request_set_fd(struct ubus_context *ctx, struct ubus_request_data *req, int fd) { (void) ctx; req->fd = fd; } static inline int ubus_request_get_caller_fd(struct ubus_request_data *req) { int fd = req->req_fd; req->req_fd = -1; return fd; } void ubus_complete_deferred_request(struct ubus_context *ctx, struct ubus_request_data *req, int ret); /* * send a notification to all subscribers of an object * if timeout < 0, no reply is expected from subscribers */ int ubus_notify(struct ubus_context *ctx, struct ubus_object *obj, const char *type, struct blob_attr *msg, int timeout); int ubus_notify_async(struct ubus_context *ctx, struct ubus_object *obj, const char *type, struct blob_attr *msg, struct ubus_notify_request *req); /* ----------- events ----------- */ int ubus_send_event(struct ubus_context *ctx, const char *id, struct blob_attr *data); int ubus_register_event_handler(struct ubus_context *ctx, struct ubus_event_handler *ev, const char *pattern); static inline int ubus_unregister_event_handler(struct ubus_context *ctx, struct ubus_event_handler *ev) { return ubus_remove_object(ctx, &ev->obj); } #ifdef __cplusplus } #endif #endif 请解读其中的数据结构
08-22
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值