简介:

--NVI即(Non-VIrtual Interface)模式强化依赖倒置,介于 Virtual与No Virtual 之间 允许子类重新实现 也可以在父类中对子类 进行限制和其它操作。

由来:

在架构设计中,我们一般喜欢设计一个基类,然后把未来扩展的工作留给它的派生类做。调用者只能看到基类的方法,不能看到实现类。这里体现了依赖倒置的原则 (DIP)。如果父类想进一步控制子类,没有运用NVI模式的基类是无法做到的。而运用了NVI模式的基类可以轻松完成。

下面我们看一个例子:

写一个教师类,由此教师类派生出个类--分别是 “ 数学老师 ” ,“ 语文老师 ” 。教师类里面提供了一个 " 布置作业 " 的虚方法供其派生重写,此外教师类还有一个教师类型

属性用于对不同教师的操作,还有一个 “上课” 方法 ,该方法用于调用 “ 布置作业 ” 。

教师类:teacher

  teacherType         //教师属性

  Attendclass()    //上课方法

  SetHomework()//布置作业方法

数学老师:mathTeacher

语文老师:chineseTeacher

--代码实现--

教师类:

    public class teacher
{
//教师类型
public string teacherType = "教师";
//上课方法 学校规定 除了数学作业可以不用交 其他 都要交
public void Attendclass(string teachertype)
{
       //这里可以写拓展代码对子类做操作
if (teachertype=="数学")
{
Console.WriteLine("数学作业可以不用交!");
}
else
{
SetHomework();
}
}
//布置作业
protected virtual void SetHomework()
{
Console.WriteLine("哇嘎嘎,布置作业咯!");
}
}

这里 SetHomework() 使用 protected 访问限制修饰符 , 我们知道 protected 修饰的字段 只有同类和子类才可以对他进行访问 这么做 是为了允许派生类重写改变实现,同时也使派生类拒绝其他对象对它的监视 。(另外需要补充的是,虚拟 抽象 成员 都不能 用 Private 修饰)

数学老师:

    public class mathTeacher : teacher
{
//构造函数 实例化一个对象时候 给其 teacherType 字段 赋值
public mathTeacher()
{
teacherType = "数学";
}
//重写父类 方法
protected override void SetHomework()
{
Console.WriteLine("数学作业:用C语言解决'高斯八皇后问题'。");
}
}

语文老师:

    public class chineseTeacher : teacher
{
public chineseTeacher()
{
teacherType = "语文";
} protected override void SetHomework()
{
Console.WriteLine("语文作业:写一篇3K字的作文,明天交。");
}
}

运行:

    class Program
{
static void Main(string[] args)
{
mathTeacher mt = new mathTeacher();
mt.Attendclass(mt.teacherType); chineseTeacher ct = new chineseTeacher();
ct.Attendclass(ct.teacherType);
}
}

结果:

数学作业可以不用交!

语文作业:写一篇3k的作文,明天交。

不难发现使用 NVI 模式 对 子类的操作 是非常 轻易 实现的。

NVI模式的更多相关文章

  1. c++学习_2

    这里承接上一篇文章,继续记录关于继承的那些事儿... NVI(non-Virtual Interface)和strategy模式 NVI模式和strategy模式是两种不同的方法,可以用来替代virt ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  4. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  7. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  8. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  9. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

随机推荐

  1. grunt小教程

    本人的博客写了grunt的小教程,从零开始,一步一步的通过例子讲解,希望喜欢的同学给我的github上加颗星,谢谢! github地址: https://github.com/manlili/grun ...

  2. POJ 2492 并查集 A Bug's Life

    #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> ...

  3. 查找mysql的cnf文件位置

    mysql --help|grep 'my.cnf' 查看mysql启动时读取配置文件的默认目录 命令 mysql --help|grep 'my.cnf' 输出 order of preferenc ...

  4. 手把手编写PHP框架 深入了解MVC运行流程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  5. Java企业微信开发_00_源码及资源汇总贴

    一.源码 此系列教程的源码我都放在了github上,欢迎fork以及关注. 传送门:https://github.com/shirayner/WeiXin_QiYe_Demo/tree/master ...

  6. (转)通过汇编语言实现C协程

    转自:http://www.cnblogs.com/sniperHW/archive/2012/06/19/2554574.html 协程的概念就不介绍了,不清楚的同学可以自己google,windo ...

  7. 绘图工具--turtle模块

    turtle模块主要使用两个类,一个是TurtleScreen类,表示画布(窗口),用来展示画的位置:一个是Turtle类,用来充当画笔,用来画. 两个类的方法也以同名的函数的形式存在,所以可以以面向 ...

  8. hdu-5652 India and China Origins(二分+bfs判断连通)

    题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K ...

  9. hihocoder-1285 智力竞赛(区间dp)

    智力竞赛 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小 ...

  10. leetcode 34 Search for a Range(二分法)

    Search for a Range Given a sorted array of integers, find the starting and ending position of a give ...