zoukankan      html  css  js  c++  java
  • NVI模式

    简介:

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

    由来:

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

    下面我们看一个例子:

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

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

    教师类: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 模式 对 子类的操作 是非常 轻易 实现的。

  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/keiling/p/3666428.html
Copyright © 2011-2022 走看看