Symbian OS 中的Class命名约定(M类)

华为OD机试真题 2026.11.4. 新系统 【河流水系流量评估】 华为OD机试真题 新系统【河流水系流量评估】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【河流水系流量评估】多语言题解。 阅读详情

计算机界的民间传说在谈到“mix-ins”的起源时,普遍认为这一概念最早源于Symbolic's Flavors——一个早期的面向对象编程系统。 它的设计者显然从“史蒂夫的冰淇淋客厅”(麻省理工学院的学生们特别喜欢的一个冰淇店)中获得了灵感,顾客们在那里选择不同冰淇淋的风味(香草,草莓,巧 克力等等)然后再加入一些混合物(坚果, 奶油软糖, 巧克力碎屑等等)。

   当谈到多重继承时,这就意味着在基础的“风味”类中加入“mix-in”类来扩展它的功能。我相信这就是Symbian的设计者使用mixin这一术语并且把M设为前缀的原因,尽管在Symbian OS中的多重继承和mixin的使用要比冰淇淋店中要复杂得多。

    总体而言,M类是一个抽象接口类。一个具体类(concrete class)通常把基础的“风味”类(例如CBase或CBase派生类)作为它的第一 个基类,然后再加入一个或一个以上的M类“mixin”接口来实现接口函数。在Symbian OS中,M类通常定义为回调(callback)接口或监 听器(observer)接口。
一个M类可以由其它M类继承得来,下面我给出了两个例子。第一个展示了一个实现接口函数的具体类派生至CBase 和一个mixin类——MDomesticAnimal,MdomesticAnimal类派生于MAnimal类但并没有对它进行实现,实际上,它是 MAnimal接口的一个特化(specialization)。

class MAnimal
{
public:
  virtual void EatL() =0;
};
class MDomesticAnimal : public MAnimal
{
public:
  virtual void NameL() =0;
};
class CCat : public CBase,public MDomesticAnimal
{
public:
  virtual void EatL(); // 通过MDomesticAnimal继承自MAnimal 
  virtual void NameL(); // 继承自MDomesticAnimal
…………………………
};

   第二个示例展示了CBase的派生类和两个mixin接口,MRadio和MClock。在这种情况下,MClock并不是MRadio的特化,CClockRadio这个具体类分别继承并实现了这两个接口。对于M类继承而言,这种复杂组合的多重继承是可以实现的。
class MRadio
{
public:
   virtual void TuneL() =0;
};
class MClock
{
public:
   virtual void CurrentTimeL(TTime& aTime) =0;
};
class CClockRadio : public CBase, public MRadio, public MClock
{
public:
   virtual void TuneL();
   virtual void CurrentTimeL(TTime& aTime);
…………………………
};

    上面展示了多重接口继承的使用,这也是在Symbian OS中唯一鼓励使用的一种多重继承形式。其它形式的多重继承将会产生相当复杂的继承分级,并且标 准基类也没有考虑这方面的设计问题。因而,对两个CBase派生类进行多重继承将会在编译时引起二义性问题,只能通过虚拟继承来解决这一问题:

class CClass1 : public CBase
{…………………………};
class CClass2 : public CBase
{…………………………};
class CDerived : public CClass1,public CClass2
{…………………………};
void TestMultipleInheritance()
{
// 无法编译, CDerived::new 有二义性
// 应明确定义CBase::new继承自CClass1还是CClass2?
   CDerived* derived = new (ELeave) CDerived();
}

   让我们来考虑一下M类的特性,它可能被认为等价于java语言中的接口。和java接口一样,M类没有数据成员,所以M类对象不需要进行初始化,因而也就不必为它编写构造函数。
    
    自然而然的,你也会谨慎的考虑M类是否应该有析构函数(无论是虚的还是非虚的)。M类的析构函数给它的接口实现方式增加了限制条件,使得它必须在 CBase的派生类中实现。这是因为析构函数就意味着调用delete,因而就要求对象必须基于heap而不能基于stack建立。这就是说实现类一定派 生于CBase,就是因为这一原因,所有的T类和绝大部分的R类都不存在析构函数。

   在通过一个指向接口类的指针拥有一个M类对象时,需要提供一些销毁M类对象的方法。如果你确信能够保证你的接口类的实施类一定派生于CBase类,那你可以在M类中提供一个虚析构函数。这样就可以让M类的所有者通过调用delete来删除它。

    如果不定义虚析构函数,对一个M类指针进行delete操作将会引发USER 42 panic,这是因为:派生于M类的具体类必然也派生于其它类,如 CBase或CBase的派生类,mixin指针应在继承声明次序中排在C类之后[1],并且这个M类的指针会转而指向M类的子对象,而不是指向有效主对 象heap单元的起始位置,这个M类的子对象是用于访问分配到heap单元上的对象的。

   可以使用内存管理代码来释放heap空间,User::Free(),但如果待清除单元的定位错误将会引发panic。这一问题可以通过使用虚析构函数来解决。

   但是,定义M类接口是并不是惟一的解决方案,你也可以考虑定义一个派生于CBase的抽象基类来代替M类。因为CBase恰好已经提供了一个虚析

1 具体类定义格式为
class CCat : public CBase, public MDomesticAnimal{…};
而 不是class CCat : public MDomesticAnimal, public CBase{…};“风味”C类必须在基类列表的第一 位,以此强调继承树的次序。类似这样的C类对象也可以通过重载CleanupStack::PushL()来压入清洁栈(参见第3章)
构函数,并且接口类的实施类也仅限于在C类中实现,所以这也是一个理想的办法。当然,在这一方法中,实施类将仅限于单重继承(single inheritance),就象在上面所说的那样,对CBase的多重继承将会引起二义性和可怕的“菱形”继承结构。

    总体而言,一个mixin接口类不应关心ownership的实现细节。如果调用者有可能通过指向M类接口的指针拥有一个对象,正如上面所说的那样,你就 必须确保提供一个在M类的所有者在不再需要M类时删除它的方法。但是,这并不限于通过析构函数进行清除。你也可以提供一个纯虚Release()函数来代 替析构函数,然后类的所有者就可以说“搞定了”——由实现代码决定使用何种清除方式(例如一个C类,就可以调用“delete this”来完成)。这是 一个更灵活的接口——实施类基于stack或heap实现都可以,它可以实现引用计数,专门的清除或其它等等的功能。顺便说一句,它实质上并不能调用清除 函数Release()或Close(),但它可以帮助你的调用者。首先,它是可识别的并足以让你推测出它将要干什么。更重要的是,它能够让用户使用 CleanupReleasePushL()函数(参见第3章)。
类似于java的接口,一个M类通常仅有纯虚函数。但是,也有例外允许使用非纯 虚函数。比如说:当某个接口的所有继承类都具有通用的缺省行为时,给这个接口添加共享的实现就可以减少代码的冗余和维护等令人头痛的事情。当然,这个缺省 的通用实现功能有很多限制,因为mixin类不能有数据成员。所以通常情况下,所有的虚函数都是通过调用mixin接口的纯虚函数实现功能的。 
深度:善用人工智能推动高等教育学习、教学与治理的深层变革 从学习方式的革新到教学模式的重构,再到治理体系的升级,人工智能已不再仅仅是辅助工具,而是成为重塑高等教育生态的核心驱动力。某高校的创新实践表明,引入AI生成虚拟患者后,医学生在临床沟通训练中的共情能力提升27%,印证了技术工具与人文教育的互补效应。美国卡内基梅隆大学的实践表明,经过系统培训的教师,其课程设计效率提升40%,且能精准定位83%学生的学习难点。当每个学生都掌握提示工程原理,每位教师都能驾驭AI教学工具,每所高校都建立智能治理框架时,教育将真正实现"以人为本"与"技术为用"的有机统一。 阅读详情

相关推荐

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理(一)

CHB-MIT癫痫EEG脑电数据处理CHB-MIT头皮脑电图数据介绍CHB-MIT头皮脑电图数据下载CHB-MIT头皮脑电图数据处理提取原始数据滤波(0.1~50hz)数据分块(时间窗口) CHB-MIT头皮脑电图数据介绍 该数据库收集自波士顿儿童医院,其中包括患有难治性癫痫发作的儿科患者的脑电图记录。停用抗癫痫药物后最多持续几天对受试者进行监测,以表征其癫痫发作并评估其对手术干预的候选资格。 从22位受试者中收集了23个病例的记录(5例男性,3至22岁; 17例女性,1.5至19岁)。 (案例chb21是

AI_DOG的博客 1万+

Symbian OS 中的Class命名约定

Symbian OS 中的Class命名约定Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch——这是世界上最长的地名,位于British群岛地区,起这么长的地名的目的在于吸引游客。SymbianOS定义了若干不同的class类型,每一种类型都具有不同的特性。Class的分类用于描述每种class对象的主要属性和行为,例

ice2000feng的专栏 502

别再只会regress了!用Stata的csdid命令搞定多期DID的完整实操指南

本文详细介绍了如何在Stata中使用csdid命令进行多期DID分析,解决传统DID方法在交错处理场景下的局限性。通过完整的实操指南,包括环境搭建、核心语法、结果解读和高阶应用,帮助研究者更准确地评估政策效果,适用于计量经济学和实证研究领域。

weixin_30236595的博客 582

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 214

Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板

EndNote插入文献常遇到以下错误主要如下: 等、et al不分; 英文作者全名大写; 期刊名字使用了缩写(图片里没有体现;卷号、期号缺失时出现乱码,多了半个括号;页码范围略去了相同部分;没有悬挂缩进,本文全部解决,全网最细

sakura的博客 3万+

实战指南:R语言多组倾向评分逆概率加权(IPTW)建模与结果解读

本文详细介绍了如何使用R语言实现多组倾向评分逆概率加权(IPTW)建模,包括数据预处理、倾向评分估计、权重计算及结果解读。通过实战案例演示,帮助研究者掌握这一统计方法,有效平衡多组混杂因素,模拟随机对照试验效果,适用于医学、社会科学等领域的数据分析。

weixin_42528534的博客 392

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 323

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.csdn.net/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.csdn.net/gyxx1998/

gyxx1998的博客 9943

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 139

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1692

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

Robot_PLC_HMI_Automation 348

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 189

【AI智能体】Dify 搭建发票识别助手操作实战详解

Dify 搭建发票识别专属助手操作实战详解

congge 5549

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 111

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 351

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 391

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 608

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 369

java框架大全

java框架大全

qq_39326137的博客 180

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 291

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 313

Agent 状态栏在上下文中的具体位置

Agent状态栏以user角色消息形式追加至上下文末尾,而非修改system消息,避免破坏KVCache。此举仅为API技术实现,内容由框架自动生成,非真实用户输入,通过<agent_status>标签标识,确保模型获取最新状态且不影响缓存。该设计遵循“动态信息追加、静态信息固定”原则,实现高效、低延迟的状态传递。

lj1109053360的专栏 67

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 300

Spring事务和事务传播机制

3. 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别.p1事务可以认为是⽗事务, 嵌套事务是⼦事务. ⽗事务出现异常, ⼦事务也会回滚, ⼦事务出现异常, 如果不进⾏处理, 也会导致⽗事务回滚.

txxzjmzlh的博客 202

读懂 Dart Future:从 async/await 到并发等待

Dart 中的 Future 用于处理异步操作,如网络请求、文件读取等。它表示一次可能延迟完成的计算,成功时返回指定类型值(如 Future<String>),失败时抛出异常。通过 async/await 可以同步式编写异步代码,提升可读性。await 暂停当前函数执行,但不影响事件循环。Future.wait() 可并发等待多个异步任务,timeout() 设置超时限制,catchError() 处理错误。注意:async 不自动开启新线程,耗时计算仍可能阻塞主线程;避免丢弃未处理的 Future,必要时

侯仕奇的博客 346
上一篇: Avkon菜单项 | 应用框架
下一篇: Nokia官方培训(Symbian 4300)笔记
WaveDHW
博客等级 码龄20年 455粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值