浅谈面向对象编程之接口

面向接口编程(或者面向抽象编程)的一个例子。 当然你得先知道面向对象是什么。   有一天,我想盖个房子,当然我自己是肯定盖不起来的,我要找村东头的强壮搬砖大哥,村南头的技术娴熟的砌墙师傅,村北头的水泥大哥和邻村的贴瓷砖师傅等。 我的计划是这样的: 先找人。 找到村东头的搬砖大哥, 找到村南头的砌墙师傅, 找到村西头的水泥大哥, 找到邻村里的瓷砖师傅, 然后,开工~ 只要房子没盖好,就执行下面的步骤: 搬砖大哥去搬砖, ... 阅读详情

写代码也学了快2年了,今天来跟大家谈谈一些基础的原理性的东西:接口

往往在新手看来,接口是没有卵用的东西,但是接口真的太强大了。边上代码边解释

public interface IPerson {
        void Tell(string name);
        void Study();
        void Sleep();
    }

我们定义了一个人的接口,可以有tell方法,study方法,Sleep方法

然后我们分别以两个类来实现这个接口:

男人类:

public class Male:IPerson
    {
        public void Sleep()
        {
            Console.WriteLine("我喜欢在大床上睡");
        }


        public void Study()
        {
            Console.WriteLine("我喜欢在图书馆学习");
        }


        public void Tell(string name)
        {
            Console.WriteLine("大家好,我叫" + name + "!");
        }
    }
女人类:
public class Female : IPerson
    {
        public void Sleep()
        {
            Console.WriteLine("我喜欢睡觉,睡觉可以保持年轻不老");
        }

        public void Study()
        {
            Console.WriteLine("我喜欢在寝室学习,寝室比较安静!");
        }

        public void Tell(string name)
        {
            Console.WriteLine("你好啊," + name + "!,很高兴见到你");
        }
    }

定义一个辅助类:

 public class Live {
        public IPerson person { private get; set; }
        public Live(IPerson person) {
            this.person = person;
        }
        public void HappyStudy()
        {
            person.Study();
        }
    }
这个辅助类构造函数接受一个IPerson的接口类型。
方法调用:

 class Program
    {
        static void Main(string[] args)
        {
            Live person1 = new Live(new Male());
            person1.HappyStudy();//调用方法
            person1.person = new Female();
            Console.WriteLine("\r\n");
            person1.HappyStudy();//调用同一个方法,但是实现的功能已经截然不同了。
            Console.ReadKey();
        }
    }
根据多态的原则,我们可以直接new一个子类作为构造函数的参数(我是这样理解这里的多态的,你要一个人是不是?我给你一个女人它是不是人?),所以我们可以实现特定的功能,但是后来我们的需求变了,我们可以直接给一个实现了IPerson接口的新的类,就可以实现功能的变更,大家觉得这样是不是很方便。

本人才疏学浅,如果错误,敬请指出。

C# 接口的作用浅谈举例 我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含方法、属性、索引器和事件的声明,但常用的接口中一般就是方法和属性,然而接口中并没有方法的具体实现代码(不能提供任何成员实现),只有方法的返回类型和方法名。一个类实现了某个接口,则必须在类中包含接口中所有方法的实现代码,换句话说就是,继承自接口的类中必须包含接口中函数的实现代码。         说到这里,可能就可以看出接口 阅读详情

相关推荐

双模音频解码器设计:USB+蓝牙LDAC平衡输出方案

音频解码器是数字音频系统中实现数模转换的核心组件,其性能直接决定音质保真度与系统延迟。基于高集成SoC的解码方案通过统一时钟域与片内DSP处理,有效抑制Jitter并简化硬件拓扑;结合全平衡模拟输出架构,可显著提升共模抑制比(CMRR)与信噪比(SNR)。该技术路径广泛应用于便携式Hi-Res音频设备、USB-C小尾巴DAC及蓝牙高解析耳机放大器等场景。本文围绕ES9038Q2M双模SoC展开,详解其在LDAC协议支持、UAC2.0兼容性及平衡电流型DAC输出方面的工程实现,为高性能、可量产音频硬件开发提供

weixin_42613018的博客 390

面向对象编程之接口

接口的定义,它与定义类方式相似,但是使用interface关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。引用数据类型:数组,类,枚举,接口,注解。接口本身不能创建对象,只能创建接口的实现类对象,接口类型的变量可以与实现类对象构成多态引用。声明接口用interface,接口的成员声明有限制:(1)公共的静态常量(2)公共的抽象方法(3)公共的默认方法(4)公共的静态方法(5)私有方法(JDK1.9以上)

weixin_53717489的博客 667

对族实例进行任意的矩阵变换,需要什么样的族?

问:一个小问题,想向您请教一下。 能不能实现一个这样的操作:创建了一个常规模型的FamilyInstance,然后知道旋转和平移的矩阵,能否根据变换矩阵更新FamilyInstance的位置,绕任意轴旋转任意角度。 请问什么样的实体才能在revit项目文件中任意旋转?貌似一般的实例只能在XY平面内旋转,并且LocationPoint中只有一个Rotation参数。答:您好,因为Revit里面的构件

我爱Revit —— BIM应用及BIM应用软件解决方案专栏 3628

Java中的接口的特点

1、用interface定义一个接口,接口用public修饰 2,、实现接口用implements实现 3、接口里变量只能是静态常量,必须赋值,方法必须是抽象方法 4、给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。接口中的方法不允许是private的 5、使用面向接口编程,应该先定义接口,再实现接口 6、使用接口是为了降低模块之间的耦合度 7、使用接口,需要实现接口的全部方法 ...

ANDY___Q的博客 515

Altium Designer学习---如何进行SI仿真

Altium designer 如何进行SI仿真。         1、仿真电路中需要至少一块集成电路;             2、器件的IBIS模型;              3、在规则中必须设定电源网络和地网络;              4、建立SI规则约束;              5、层堆栈必须设置正确,电源平面必须连续;     建立的文件必须是一个工程,并把相应的文件放在工程目...

weixin_34050519的博客 4904

RPN 解析

RPN全称是Region Proposal Network,Region Proposal的中文意思是“区域选取”,也就是“提取候选框”的意思,所以RPN就是用来提取候选框的网络; 1. RPN的意义 RPN第一次出现在世人眼中是在Faster RCNN这个结构中,专门用来提取候选框,在RCNN和Fast RCNN等物体检测架构中,用来提取候选框的方法通常是Selective Se

lanran2的博客 10万+

面向对象编程和面向接口编程的区别

随记 说实话,没有一定编程基础,这两个还真的是很难懂,因为对于IT编程思想很重要,如果有了编程思想,这两个的区别就很好理解了。 1、面向对象编程: 首先java就是面向对象编程,所谓在java中万事万物皆对象,这是因为java中所有类的调用都是new出来的, 其次面向对象用到三大特性,即封装、多态、继承。 2、面向接口编程: 一个接口可以从三方面去考察:制定者(或者...

上官海翰 4637

基于 Logistic 混沌映射和 Arnold 变换 的变换域水印改进算法【高级网络与信息安全技术-信息隐藏期末课程论文】

摘要:\textbf{摘要:}摘要:本文提出了一种新的水印算法是一种图像认证的新方法。算法首先使用Logistic混沌映射加密水印图像,然后使用Arnold变换置乱水印。同时改变了水印图像的像素位置和像素值,大大提高了算法的安全性。再使用DCT变换嵌入水印,并且结合人类视觉系统的特点来提升水印嵌入的透明性。实验结果表明,本文提出的水印算法可以大幅度提高水印嵌入的透明性与安全性的同时,并不降低算法的鲁棒性。注:完整的代码和论文在文末,百度网盘链接。

zik的博客 894

浅谈Java面向对象编程之多态、继承、抽象类、接口

1. 包 包 (package) 是组织类的一种方式。 使用包的主要目的是保证类的唯一性。 1.1 导入包中的类 java中提供了很多现成的类供我们使用 public class Test { public static void main(String[] args) { java.util.Date date = new java.util.Date(); // 得到一个毫秒级别的时间戳 System.out.println(date.getT

na 小子叫坚强的博客 1540

WOFOST作物模型(1):PCSE环境配置

get_summary_output() 方法通常用于在 PCSE 模拟过程结束后,获取模拟结果的摘要信息,例如模拟期间的总产量、总水分需求等。它可以提供对模拟结果的快速总结,方便用户进行后续的分析和处理。用.get_output来获取过程参数,并将这些参数转为dataframe显示。用run_till_terminate()代表终止。安装好之后,打开jupyter notebook。也可以指定运行时间,并获取最后一天的参数。首先还是打开之前建好的gee虚拟环境。

所有专家都曾始于新手 681

SAP MM模块后续借记、后续贷记、贷方凭证简介

在SAP系统中,后续借记、后续贷记和贷方凭证是处理供应商发票、采购和付款过程中常见的财务交易。

我小时候很黑的博客 3271

浅谈PHP面向对象编程(七、抽象类与接口)

7.0 抽象类与接口 当定义一个类时,常常需要定义一些方法来描述该类的行为特征、但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口。 抽象类和接口用于提高程序的灵活性、抽象类是一种特殊的类,而接口又是一种待殊的抽象类。 接下来本节将针对抽象类和接口进行详细讲解。 7.1 抽象类 当在定义一个类的 时候,其中所霜的某些方法暂时并不能完全定义出来,...

dice7578的博客 361

内容审核与文本安全技术综述:检测、过滤与对齐

检测质量高度依赖数据。毒性/仇恨/冒犯语言检测领域形成了一批经典数据集,但它们的标签体系差异很大:例如 OLID(OffensEval)强调“是否冒犯—冒犯类型—目标对象”三层结构;HateXplain 在“hate/offensive/normal”三分类之外,还提供目标群体与人类标注的 rationale span;RealToxicityPrompts 则不做离散标签,而是用毒性分数来研究“模型续写时的毒性退化”。ACL 汇编。

nmdbbzcl的博客 1372

浅谈面向对象编程

今天我们来简单地谈一下面向对象编程的理念。

voyager3的博客 576

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

浅谈你对面向对象编程的认识

面向对象编程强调抽象、封装、继承、多态 抽象:我们在定义一个抽象类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象。你可以这样来想,抽象就是一个类的最基础的东西,比方说人,他的抽象类可能就是都从母体出来,有皮肤。但具体到你是黑人,白人,还得黑人类,白人类来说明 。 封装:就是将类的属性包装起来,不让外界轻易的知道他的内部实现

wang_159369的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅谈抽象类与接口

2)Java或C++等静态类型的语言为了防止在运行时因为找不到实现而报错,会在编译期间做检查,要求对象必须具备指定的类型,否则编译器就认为对象没有相关方法的实现,编译无法通过。这就是说明接口和实现其实是分离的,但…接口和抽象类是面向对象编程中的两个重要概念,它们分别对应两种继承方式——接口继承、类继承,这两种继承的含义、用途存在差异,理解这些差异能帮助我们设计出可复用性更高的代码。一样的关键字专门用来标识接口,但不妨碍C++使用接口的概念——C++中只包含纯虚函数的类与Java的“接口”是一样的效果。

米碎师兄 1696

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

浅谈面向接口编程

聊一聊面向接口编程。

靖待的优快云博客 352

浅谈理解Java抽象类和接口

抽象是面向对象编程的特征之一,抽象类和接口有类似之处,当然也有不同不处,本文我们来探个究竟~ 1.抽象类 了解抽象类之前,我们先来了解一下抽象方法,这种方法是不完整的,仅有声明而没有方法体,下面是抽象方法声明的语法: 包含抽象方法的类叫抽象类,类的声明加上了abstract关键字的类就是抽象类。当然一个被声明成抽象方法的类,里面可能没有抽象方法,但是这样就失去了抽象类的意义了,和普通的基...

qq_26842071的博客 223

浅谈抽象类和接口的区别和联系

浅谈抽象类和接口的区别和联系 一、抽象类 (1)abstract修饰的类为抽象类,此类不能有对象,(无法对此类进行实例化,说白了就是不能new); (2)abstract修饰的方法为抽象方法,此方法不能有方法体(就是什么内容不能有); (3)关于抽象类的使用特点:抽象类不能有对象,(不能用new此关键字来创建抽象类的对象);有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法; (4)抽象类中...

weixin_46110257的博客 364

C++面向接口编程浅谈

大家都知道C++和java都是面向对象的编程语言。面向对象语言的三个特征:继承、封装和多态,但是java和C++还是有许多的不同之处,除了语法之外还有一点不同就是java中有的接口这个概念和关键词,但是C++却没有接口这个概念。 既然它们都是面向对象语言,也就有面向对象编程的特征,也就是把数据和对数据的处理(算法)封装在一起了。通过定义类使用类来定义类对象,然后这个对象就有了封装的数据和对数据的这...

wb175208的专栏 3889
上一篇: 在Asp.Net MVC中使用AngularJS的路由
下一篇: 在BackGroundWorker中使用ArcGIS组件
遛狗的代码
博客等级 码龄11年 10粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值