第7篇 WPF C# 怎样定义类及其接口
1、概述
1.1 类和接口的本质
类和接口用于表述事物的特征,从而成为可编程的东西。也就是将物理存在的事物表述为编程可用的代码。
类提供一个好像标准模板一样的东西,通过实例化变成程序中各个不同的对象。
接口是不能实例化的与类一样的东西(定义语法不通)。
下图分析怎样将物理存在的事物概括为类或接口。
1.1.1 抽象类、派生类、接口、结构
比如车,就是一个抽象类。而汽车、火车也是抽象类。汽车中的轿车、SUV、客车就是具体的类。
汽车、火车是车的派生类。轿车、SUV、客车是汽车的派生类。
汽车的载客数量、轮胎型号、火车的载重是特征。
派生于不同的抽象类的派生类可能具有共同的特征,这些特征可定义为接口。
结构则是具体数值的类。
1.1.2 类的浅度复制和深度复制
简单地按照成员复制对象称为浅度复制,可通过派生于System.Object的MemberwiseClone()方法来完成。这是一个受保护的方法,但可以很容易在对象上定义一个调用该方法的公共方法。浅度复制未考虑“引用类型成员”,因此,新对象的“引用成员”就会指向 源对象中 相同成员 引用的 对象,这是浅度复制的局限。
如果要创建成员的新实例,复制值,而不复制引用,此时需要深度复制。可使用一个标准的方法来进行,即通过实现一个ICloneable接口来完成。如果使用ICloneable接口,必须实现它包含的Clone()方法,这个方法返回一个System.Object的值。我们可以采用各种处理方式,实现所选的任何一个方法得到这个对象。深度复制的局限是 该方法应该返回什么,并无规则和限制。
1.1.3 部分类的定义
1.1.4 部分方法的定义
1.2 编程设计:类库项目
定义类的代码可以放在不同的文件中,也可以放在不同的项目中。只包含类文件的项目称为类库项目。类库项目编译后生成.dll程序集文件。在不同的项目中使用类库内的类,通过引用该.dll程序集文件进行。引用后,在XAML前台标记文件中,应声明其命名空间;在代码隐藏文件(后台)中应使用Using语句声明。
2、类、接口、结构的定义标准语法
1.1 类的定义
1.1.1 声明类和接口
public class MyClass[ : MyBase][, IMyInterface][, IMySecondInterface]
{
// Class members.
}
1.1.2 定义构造函数和析构函数
定义构造函数
(1)默认构造函数:如未定义,则自动生成默认构造函数
(2)重构函数:可定义多个重构函数
(3)构造函数的执行顺序:总是从最基的类开始,执行前总是先调用函数
语法:
public MyClass()
{public MyClass(){// Default constructor code.}public MyClass(int myInt){// Nondefault constructor code (uses myInt).} }
定义析构函数
当进行垃圾回收时,就执行析构函数中的代码,释放资源。调用这个函数后,还会隐式地调用基类的析构函数,包括System.Object 根类(root class)中的Finalize() 调用。
语法:
class MyClass {~MyClass(){// Destructor body. } }
1.1.3 定义类成员
一、使用代码定义类成员
(1)定义字段
标准语法
class MyClass { public [readonly] int MyInt = 17; }
(2)定义方法
定义方法使用标准函数、可访问性和可选的static修饰符完成。
举例:
class MyClass {public string GetString() //返回类型string { return "Here is a string."; } } public class MyBaseClass { public virtual void DoSomething() //virtual-----方法可以重写 {
// Base implementation. } } public class MyDerivedClass : MyBaseClass { public override void DoSomething()//override ---- 重写了一个基类的方法(如果重写方法,必须使用该关键字) { // Derived class implementation, overrides base implementation. } } public class MyDerivedClass : MyBaseClass { public override sealed void DoSomething() //sealed----如果使用了重写,可以指定在派生类中不能对此方法重写。 { // Derived class implementation, overrides base implementation. } }
(3)定义属性
采用基本结构
public int MyIntProp {get //访问器{// Property get code.}set //访问器{// Property set code.} }
举例
// Field used by property.private int myInt; // Property. public int MyIntProp{get{return myInt;}set{// Property set code. } }
// Field used by property. private int myInt; // Property. public int MyIntProp{get{return myInt;}set{myInt = value;} }
采用自动生成的结构:
public int MyIntProp {get;set; }
可以书写为:
public int MyIntProp { get; set; }
二、使用类图添加成员和定义属性
(略)
三、怎样正确定义类成员
a、使用恰当的关键字
定义类和成员字段的关键字如下:
➤ public — Members are accessible from any code.
➤ private — Members are accessible only from code that is part of the class (the default if no keyword is used).
➤ internal — Members are accessible only from code within the assembly (project) where they are defi ned.
➤ protected — Members are accessible only from code that is part of either the class or a derived class.
定义字段还可以使用readonly关键字。
定义方法的关键字如下:
➤ static — The method is accessible only through the class, not the object instance.必须通过类访问,不能通过对象实例访问。
➤ virtual — The method can be overridden.该方法可以被重写。
➤ abstract — The method must be overridden in non-abstract derived classes (only permitted in abstract classes).该方法仅可在非抽象的派生类中重写。
➤ override — The method overrides a base class method (it must be used if a method is being overridden).重写了一个基类的方法(如果重写方法,必须使用该关键字)
➤ override sealed — 指定在派生类中不能对此方法重写
➤ extern — The method definition is found elsewhere.方法在其它地方定义。
定义属性的关键字如下:
可以使用virtual, override, and abstract
b、使用自动属性和外部只读属性
使用自动属性只能通过属性访问,不能通过底层的私有字段访问。无法使用自动属性定义只读或只写的属性,但可以创建一个外部只读属性,如下代码所示:
public int MyIntProp { get; private set; }
Here you can access the value of MyIntProp only from code in the class defi nition.
c、隐藏基类方法
例如,当继承的公共成员不像预期那样工作时,就可以隐藏基类。
c1、举例如下:
public class MyBaseClass//基类 {public void DoSomething(){// Base implementation } }public class MyDerivedClass : MyBaseClass //继承基类的类{ public void DoSomething() { // Derived class implementation, hides base implementation. } }
上述代码编译时会发出警告。如果确系需要隐藏,纠正的方法如下:
public class MyDerivedClass : MyBaseClass { new public void DoSomething(){// Derived class implementation, hides base implementation.} }
c2、通过重写方法实现新的方法,举例如下:
public class MyBaseClass {public virtual void DoSomething(){Console.WriteLine("Base imp");} } public class MyDerivedClass : MyBaseClass {public override void DoSomething(){Console.WriteLine("Derived imp");} }
c3、c2可以书写为:
public class MyBaseClass { public virtual void DoSomething() { Console.WriteLine("Base imp"); } } public class MyDerivedClass : MyBaseClass { new public void DoSomething() { Console.WriteLine("Derived imp"); } }
d、调用重写或隐藏的基类的方法
d1、base关键字
d2、this关键字
e、嵌套的类型定义
2.2 接口的实现
including a call to
in the System.Object root class. This
转载于:https://www.cnblogs.com/moiska/p/5009686.html
第7篇 WPF C# 怎样定义类及其接口相关推荐
- java 用面向接口编程的方式开发打印机_Java“打印机”模型理解面向接口编程。实现接口定义类,接口实现类,核心“业务”类分离...
接口定义类 IinkBox.java package printerDemo.iface; public interface IInkBox { public String getColor(); } ...
- java类和接口实例_Java定义泛型接口和类的方法实例分析
本文实例讲述了Java定义泛型接口和类的方法.分享给大家供大家参考,具体如下: 一 点睛 所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数 ...
- Scala学习之类和属性篇(一):定义类的主构造方法
2019独角兽企业重金招聘Python工程师标准>>> 在Scala中直接在类名后面跟上参数,即可定义类的主构造方法. scala> :paste // Entering pa ...
- [Aaronyang]谈谈2015年AY对WPF全面技术总结40多篇WPF,炫到没朋友的AYUI来了
原著:AY WPF博客- 把wpf推广出去,让那些鄙视的人说不 大家好! 我是AY,首先声明,我在做一件很枯燥的事情,我是个91后程序员,每天熬夜完成计划的过着下班后的生活. 那天有 ...
- python 类-Python入门--一篇搞懂什么是类
原标题:Python入门--一篇搞懂什么是类 写一篇Python类的入门文章,在高级编程语言中,明白类的概念和懂得如何运用是必不可少的.文章有点长,3000多字. Python是面向对象的高级编程语言 ...
- python定义类object_Python之ClassObject用法详解
类和对象的概念很难去用简明的文字描述清楚.从知乎上面的一个回答中可以尝试去理解: 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行 ...
- python简单定义_python定义类的简单用法
python定义的类使用方法: 使用"obj=类名()"语句将类实例化,然后用"obj.函数名"就可以调用类里面定义的各种函数了 示例如下: 将Bili类实例化 ...
- java.lang.object源码_第三篇:java.lang.Object 类源码分析
Object所包含的方法如下: ① public Object(); 构造函数: 大部分情况下,类对象的声明,都是通过构造函数完成的(Java中规定:在类定义过程中,对于未定义构造函数的类,默认会有一 ...
- python中类的定义_python 类中定义类
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 现有自定义类(color.py)如下,类位于路径'userschuxingpyt ...
最新文章
- 中国出版业,九死一生
- 关于大型站点技术演进的思考(七)--存储的瓶颈(7)
- C/C++面试题精选
- 中国移动系统集成公司2020春招技术综合在线编程题第一题
- 我的第一次博客 张学良
- java控制io_Java-IO操作
- 本周三、四两场直播丨云时代的数据管理;PG与openGauss的分区特性
- Java 程序员中位数薪资达 1.45 万,但面试屡屡被拒?
- APACHE OFBIZ XML-RPC 反序列化漏洞 (CVE-2020-9496) 的复现与分析
- git base cli
- 系统集成项目管理工程师考试题型
- 收藏夹+阿里云图标:再也不用担心visio找不到好用的图标了!
- 全球及中国工业废物处置服务行业行业发展趋势及十四五规划展望报告2022-2028年
- JAVA日期转换函数(包括:日期、周数的计算)
- 如何重新扫描 Emulex FC 控制器上的新 LUN
- 阿里云IOT设备数据接入 (从阿里云IOT云平台获取设备数据)
- electron与jquery起冲突,使用jquery报错解决方法
- 《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》论文翻译
- 基于数字温度传感器的数字温度计 华氏度和摄氏度
- 1N4148、1N5819、1N4007的区别