首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

绑定子类的泛型基类,反模式?

这次总结一个个人认为的反模式:“绑定子类的泛型层基类”,这个模式在一些著名的框架中也见到过,如果CSLA、BlogEngine。我自己在原来的写的框架中,也用到过。    ...当然了,个人认为是反模式,各们同仁并不一定这样认为,仁者见仁,智者见智了。不过我好几次都是受尽折磨,所以决定写出来给大家分享下心得。...模式介绍     “层基类”是MF提出的一个基本模式,详见:《Layer Supertype》。这种模式在经典的层次型架构设计的实现中,是极其重要的。...这是为了在基类实现的通用方法中,能够以强类型的方式直接访问最终的子类。...再举一个例子:由于泛型基类运行时绑定了不同的子类,使得它本身的静态字段绑定到最终的子类中的。

1K50

基类、扩展类──页面重构中的模块化设计(五)

基类、扩展类──页面重构中的模块化设计(五) 由 Ghostzhang 发表于 2010-06-11 19:24 基类 和 扩展类 是这个系列的主要内容,上一篇《 模块化的核心思想──页面重构中的模块化设计...也就是说,当出现多个类似的模块时,基类包含了这些模块的大部分的效果(或者理解为公共的部分),在基类的基础上,我们可以通过添加很少的代码——扩展类,来达到所需要要效果。...……5分钟过去了……差不多有方案了,按上面的思路,基类是包含了大部分的效果的,也就是说基类应该能满足大部分效果的需要,两个模块间差异的地方,可以通过扩展类来完成。...所以我们可以把这两个模块看成的类似模块。另个,以哪个为基类呢?从满足大部分效果这个要求来看,很明显A模块做为基类是要比B模块做为基类更合适的,如果用B模块做基类,那么需要写更多的扩展类来满足A的需要。...效果展示 例子中可以看到,扩展类的定义很少,只是一些简单的定义,像B模块: /* S 消息 扩展 */ .message_nopic{padding-left:0;} /* E 消息 扩展 */ 只需要一句

72850
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    简易理解设计模式之:模板方法模式——Android中的BaseActivity基类

    类图: AbstractClass(抽象模板类):定义了一套算法框架。 ConcreteClass(具体实现类):实现模板方法步骤中未执行的方法。...• 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽到父类中,然后通过子类约束其行为。...可能很多朋友已经在无意之中用到了这种模式,下面就让我们在Andoird上试一下: 需求:实现界面控制器的基类 1、继承实现 1.1、新建一个BaseActivity基类 public abstract...那我们不妨再检查下自己的代码,有无存在1.1中提到的问题~ 感谢您的阅读~ 推荐阅读 基础篇: 设计模式前篇之——UML类图必会知识点 设计模式前篇之——一起过一下面向对象的概念 创建型模式:...:模板方法模式——Android中的BaseActivity基类 简易理解设计模式之:观察者模式——监听与回调 简易理解设计模式之:状态模式——优化登录操作 简易理解设计模式之:备忘录模式——Word

    68420

    MySQL中,一条语句是否会被binlog记录以及以什么样的模式记录

    翻译 MySQL 5.6 中,一条语句是否会被binlog记录以及以什么样的模式记录,主要取决于语句的类型(safe,unsafe, or binary injected),binlog格式(STATEMENT...二进制形式记录必须使用row模式。 各种引擎对于binlog format的支持 下面的表格展示了各种引擎对于binlog format的支持: ?...中的任何一种; 否则,无论Innodb的binlog_format 设置为STATEMENT、ROW、MIXED中的任何一种,实际记录的也只是ROW格式。...哪些情况会记录成row模式 当binlog_format=MIXED的时候,如下情况下会自动将 binlog 的格式由 STATEMENT变为 ROW 模式: 当函数中包含 UUID() 时; 2 个及以上包含..., 详见: http://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html; 调用了mysql库中的log型table; 使用了 LOAD_FILE

    2.4K90

    Swiftshield:SwiftOBJ-C 代码混淆工具

    虽然文档中的特定情况不会被混淆,但SwiftShield将对所有可以进行逆向的Swift类和方法进行混淆处理。...Crash logs 进行反混淆处理 成功加密项目后,SwiftShield将生成一个包含conversionMap.txt文件的输出文件夹,其中包含对项目所做的所有更改。...的一个或多个模块/扩展无法满足这些条件,则可以使用-ignore-modules参数避免对其进行混淆处理。...2.没有调用Swift方法的Objective-C类(调用Objective-C方法的Swift类是可以的,除非涉及到接口) 3.最新的Swift版本和Xcode命令行工具(适用于所有版本,但由于SourceKit...如果您修改这些plist指向不同模块中的类,则必须在运行此工具后手动更改它们。) 手动模式 请确保你的标签不会被用在那些不应被混淆的内容上,例如硬编码字符串。

    2.6K00

    Dart的语法详解系列篇(三)-- mixin入门详解一、继承歧义

    该算法强制执行两个约束:子类先于父类,如果一个类从多个类继承,它们将按照基类元组中指定的顺序保存(但是在这种情况下,继承图中较高的一些类可能先于图中较低的类)。...类只能从单个类继承,但是可以根据需要混合(mix-in)任意多的特性。Scala使用扩展的traits的右优先深度优先的搜索来解析方法名,然后除去结果列表中每个模块的最后一次出现。...所以,解决的顺序是[D, C, A, B, A],被减少到[D, C, B, A] 只允许单个继承(类只能从一个基类派生)的语言没有菱形问题。...此外,Ada、Objective-C、c#、Delphi/Free Pascal、Java、Swift、PHP等语言允许接口的多重继承(在Objective-C和Swift中称为protocols(协议...然而,即使当多个接口声明相同的方法签名时,只要该方法在继承链中的任何位置实现(定义),它就会覆盖该方法在其上链中的任何实现(在它的超类中)。因此,在继承链的任何给定级别上,任何方法最多只能有一个实现。

    1.9K10

    Kotlin 函数声明和扩展(extension)

    但 Utils 实际上是反 OOP (面向对象模式)的妥协产物。...在实际项目实践中,这个条件往往是缺失的,因为在团队开发中,个人无法掌握所有代码,因为不知道这个代码已经有人实现过了,导致大家都实现了自己的 Utils。...那么抛开 Utils 的设计缺点,我们是否可以避免使用上的缺点?Kotlin 提供的解决方法就是扩展(extension)。 2....Kotlin 的扩展特性和 objective-C 的 category 特性功能非常相似,都是为一个现有的类添加方法(且只能添加方法),只是代码组织结构上有些许差异。...但 objective-C 的 category 特性是 runtime 特性,Kotlin 扩展的实现更接近语法糖。 3. 总结 Kotlin 扩展依然没有解决 Utils 类的设计缺点。

    99620

    C Sharp(四)

    继承 ---- 通过继承我们可以定义新的派生类(derived class),来对基类(base class)进行扩展。...派生类的成员包括: 本身声明的成员 基类的成员 注意: 派生类不能删除它所继承的任何成员。 要声明一个派生类,需要在类名后跟一个冒号,然后跟基类名。与 Objective-C 的继承声明相同。...没有基类声明的类隐式直接派生自 object 类。 C# 中的继承是单继承,与 Objective-C、JavaScript 一样。...在派生类屏蔽基类成员的要点如下: 要屏蔽一个数据成员,需要声明一个新的相同类型的同名成员 要屏蔽一个函数成员,需要在派生类中声明带有相同签名的函数成员 要然编译器知道我们故意屏蔽基类成员,需要使用 new...如果要在派生类中需要访问被屏蔽的成员,可以使用基类访问表达式来访问隐藏的成员。

    64020

    面向对象设计的设计模式(十一):装饰者模式

    下面我们再声明装饰者的基类SauceDecorator。...现在抽象构件和装饰者的基类都创建好了,下面我们创建具体构件和具体装饰者。...之所以可以获取到原有的描述,是因为在构造方法里已经获取了被装饰者的对象(在装饰者基类中定义的方法)。同样地,价格也在原来的基础上增加了自己的价格。...下面我们看一下该代码实现对应的类图。 代码对应的类图 装饰者模式代码示例类图 优点 比继承更加灵活:不同于在编译期起作用的继承;装饰者模式可以在运行时扩展一个对象的功能。...Objective-C & Java的实践 Objective-C中暂时未发现装饰者模式的实践,有知道的小伙伴可以留言 JDK中:BufferReader继承了Reader,在BufferReader的构造器中传入了

    42320

    Swift的属性,方法,下标脚本以及继承

    这里我们在调用其函数时才对dataList进行訪问,而訪问的时候再依据它是否创建过进行是否载入的决定。...这里这个函数我们须要对刚才定义过的点结构体进行扩展,扩展中改动了其属性,所以须要将函数加mutating修饰。 在变异方法中我们相同能够给self赋值。...另外假设我们在没有实例时,比如在类方法中,使用了self,则self指向这个类型而不是实例。比如Objective-C中的[[self alloc] init]写法。...下标脚本(subscripts) 这个概念在Objective-C中并没有,我们说Swift语法比較灵活和强大,在于它对结构体,枚举,函数的强大功能进行了扩展和支持,比如函数在Swift中属于First-Class...继承 在Swift中,继承是区分”类”和其他类型的一个基本特征。 基类 不同于OC中的NSObject,Swift中的类并非从一个通用的基类继承而来的。

    88410

    iOS开发之 Method Swizzling 深入浅出

    继承 我们可以使用继承的方式来解决这个问题。创建一个基类,在这个基类中添加统计方法,其他类都继承自这个基类。 然而,这种方式修改还是很大,而且定制性很差。...以后有新人加入之后,都要嘱咐其继承自这个基类,所以这种方式并不可取。 Category 我们可以为UIViewController建一个Category,然后在所有控制器中引入这个Category。...[xg5j821wjw.png] [c6im9zbj30.png] Method Swizzling 使用注意 类簇设计模式 在iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇...dynamic 标记,以指明它们需要使用动态派发机制。...再注:下面这个例子使用了 Objective-C 的动态派发,对于 NSObject 的子类(UIViewController)是可以直接使用的,并不是 Swift 中自定义的类,因此没有加 dynamic

    2.4K70

    iOS 面试策略之系统框架-设计模式

    [1240] 我个人认为,突破这个瓶颈的捷径就是掌握设计模式。设计模式是前人总结的、面对开发中常见问题的解决方案——它们行之有效、便于理解、适合举一反三。简单点说,设计模式就是开发中的套路和模板。...关键词:#创建型 #结构型 #行为型 iOS 开发中的设计模式有很多,一般最常见的有这 7 种: MVC:是应用的一种基本架构,主要目的是将不同的代码归于不同的模块,做到低耦合、代码分配合理、易于扩展维护的目的...View 层的交互传到 Model 层以改变数据。...Objective-C 和 Swift 在单例模式的创建上有什么区别? 关键词:#线程安全 单例模式在创建过程中,要保重实例变量只被创建一次。...它的文件名一般为“类名+扩展名” Extension 在 Swift 中的地位等同于 Category 在 Objective-C 中的地位。

    1.6K20

    让人误会的一种设计模式——模板方法模式

    ConcreteClass(派生类):实现在基类中声明的抽象方法,也可以覆盖在基类中已经实现的方法。...在这个实例中,Jungle首先定义了基类FingerprintModule,声明了基本方法:采图getImage()、判断是否在安全模式isSafeMode()、加密encrypt()、解密decrypt...优点: 在基类中定义算法的框架,并声明一些流程方法,由具体派生类实现细节,派生类中的实现并不会影响基类定义的算法的框架流程; 公共行为在基类中提供实现,有利于代码复用; 派生类可以覆盖基类的方法,重新实现某些方法...,具有灵活性; 可以很方便的扩展和更换派生类而不影响基类和其他派生类,符合开闭原则和单一职责原则。...适用环境: 分割复杂算法,可以将算法的框架流程定义在基类中,设计为模板方法;而具体的细节由派生类设计实现; 各个派生类的公共部分提取到基类中,以实现代码复用; 派生类需要覆盖基类的某些方法。

    39020

    何时(不)使用Java抽象类

    在本文中,我们将使用一些模式和反模式的示例来说明何时使用抽象方法,何时不使用。 虽然本文从Java的角度介绍了该主题,但它也与大多数其他面向对象的语言相关,即使那些没有抽象类概念的语言也是如此。...反模式很简单:许多子类只与它们位于技术堆栈中的位置相关,从一个公共抽象基类扩展而来。此抽象基类包含任意数量的共享“实用程序”方法。子类从自己的方法中调用实用程序方法。...因此,许多例子都被滥用,瑞士军刀式的Controller就是一个常见的例子。实际上,我发现抽象类的大多数典型用法都可以被认为是反模式,抽象类有一些很好的用法。...问问自己:类的调用者是否会调用在抽象基类中实现的方法,或者在具体子类中实现的方法? 如果它是前者,那么您打算只公开在抽象类中实现的方法- 可能性是您创建了一组良好的,可维护的类。...如果是后者,调用者将调用子类中实现的方法,而子类又调用抽象类中的方法。瑞士军队的反模式正在形成的可能性很大。 希望这些可以帮到你!请在下面的评论中告诉我们你的想法。

    1.2K30

    PHPUnit 手册【笔记】

    )类,要求实现getConnection()和getDataSet() 2.PHPUnit的数据库扩展模块需要用PDO库来实现跨供应商抽象访问数据库连接,PDO连接仅仅用于清理和建立基境 3.getDataSet...仅当函数或方法的所有可执行行全部已覆盖时PHP_CodeCoverage才将其视为已覆盖 3.类与物质覆盖率(Class and Trait Coverage)按单个类或特质的所有方法是否全部已覆盖进行计量...仅当一个类或性状的所有方法全部已覆盖时PHP_CodeCoverage才将其视为已覆盖 4.Opcode覆盖率(Opcode Coverage)按函数或方法对应的每条opcode在运行测试套件时是否执行到进行计量...7.变更风险反模式(CRAP)(Change Risk Anti-Patterns (CRAP) Index)基于代码单元的圈度(cyclomatic complexity)与代码覆盖率计算得出的,不太复杂并具有恰当测试覆盖率的代码将得出较低的...的TestDox功能着眼于测试类及其所有测试方法的名称 3.敏捷文档也可以以HTML或纯文本格式生成,并写入文件中,用--testdox-html和--testdox-text参数即可 B.跨团队测试

    1.7K40

    Hades:移动端静态分析框架

    另外,以正则匹配为核心建立的工具栈难以得到持续优化。为了分析项目的依赖关系,我们需要判断代码中的符号含义以及符号间关系(如包含哪些类,类中有哪些方法等),分析过程的正则表达式如下图所示。...其它节点类型并不会从公共基类继承,因此,没有用于访问树中所有节点的通用接口。 遍历方式。 为了分析 AST,我们需要遍历语法树。...RecursiveASTVisitor 能够让我们以深度优先的方式遍历 Clang AST 节点。我们可以通过扩展类并实现所需的 VisitXXX 方法来访问特定节点。...HadesModel 以一个完整的编译单元为单位,支持 JSON 格式表达。 对于 Objective-C ,分析过程不必强依赖于 xcodebuild 编译构建过程。...因此,对继承链管控的需求非常有必要。我们的 App 之前就出现了扩展同名方法,意外导致方法复写,从而在程序运行时出现问题,甚至导致 Crash。 为此,我们在集成准入检查中加入了方法覆盖检查。

    2.9K30

    Objective-C笔记

    带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。...下图是一个名为MyClass的类声明介绍: class.png 声明 遵循C语言的规范,类声明一般定义在.h头文件中。类声明以关键字@interface作为开始,@end作为结束。...而类实现中定义的属性为private。 当然也可以使用@public、@private等助记符来覆盖默认行为。 实例化 实例化即创建对象。...不过在Objective-C 2.0引入了新的语法以声明变量为属性, 并包含一可选定义以配置访问方法的生成。属性总是为公共的,其目的为提供外部类访问(也可能为只读) 类的内部变量的方法。...其中,SEL类型是Objective-C中消息的类型。 类别(Category) Objective-C借用并扩展了Smalltalk实现中的"分类"概念,用以帮助达到分解代码的目的。

    95640

    Java 设计模式最佳实践:二、创建型模式

    我们可以添加一个新类来负责实例化vehicle对象。我们将基于这个SimpleFactory类调用模式。 简单工厂模式 工厂模式用于封装逻辑,以实例化通过公共接口引用的对象。...我们首先在基类Vehicle中添加一个抽象方法: abstract public Vehicle newInstance(); 对于每个产品,必须实现基类中声明为abstract的方法: @Override...让我们看看下面的类图: 在原型模式中,涉及以下类: Prototype:这是基类,或者一个接口,它声明派生对象必须实现的clone()方法。...在一个简单的场景中,我们可能没有基类,直接的具体类就足够了。 ConcretePrototype:这些类实现或扩展了clone()方法。应该始终实现此方法,因为它返回其类型的新实例。...如果clone()方法是在基类中实现的,而我们没有在ConcretePrototype中实现,那么当我们在ConcretePrototype对象上调用clone()方法时,它会返回一个基类Prototype

    37310

    【JAVA-Day33】掌握Java方法技巧:重载与覆盖的解析

    使用适当的数据结构和设计模式: 选择适当的数据结构和设计模式来实现代码,以确保代码结构清晰,并且易于维护和扩展。 单一职责原则: 每个方法和类应该只有一个明确的责任。...代码复审: 定期进行代码复审,让其他开发者审查您的代码,以发现潜在的问题和改进的机会。 如何设计接口和基类以便于覆盖 当设计接口和基类时,考虑到方法覆盖的需要可以提高代码的可扩展性。...使用抽象类作为基类: 如果您希望某些方法在所有子类中都有通用的实现,可以使用抽象类作为基类,并在抽象类中提供通用的方法实现。子类可以选择性地覆盖这些方法以进行自定义。...考虑模板方法模式: 使用模板方法设计模式可以在基类中定义算法的框架,同时允许子类覆盖其中的某些步骤以实现特定的行为。 提供扩展点: 在基类中提供一些可扩展的点,以便子类可以添加特定的功能或行为。...图形库 在图形库中,可以使用方法覆盖来实现不同类型的图形对象的绘制。每个图形类可以覆盖基类的绘制方法,以实现自定义的绘制行为。

    14610

    谈谈springboot的模板方法模式

    Spring Boot中的模板方法模式应用在Spring Boot中,模板方法模式的应用非常普遍,特别是在那些提供了默认行为但允许用户自定义或扩展这些行为的组件中。...例如,AbstractAuthenticationProcessingFilter 类定义了处理身份验证请求的基本流程,开发者可以扩展这个类并覆盖其中的方法来定制安全行为。...开发者可以继承此类并实现其抽象方法,以提供具体的请求处理逻辑。模板方法模式的优势使用模板方法模式的主要优势包括:代码复用:通过继承实现的模板方法允许复用基类中的代码,减少了重复代码的编写。...扩展性:模板方法提供了一种扩展机制,使得开发者可以在不改变基类代码的前提下,通过继承和重写方法来扩展功能。维护性:由于算法的结构被预先定义,在基类中实现,这增加了系统的整体可维护性。...结论在Spring Boot中,模板方法模式是一种重要的设计模式,它不仅允许开发者通过标准化的方式复用代码,还提供了必要的灵活性来扩展和自定义框架的核心功能。

    28621
    领券