当前位置: 首页 > news >正文

WPF学习(1)--类与类的继承

在面向对象编程中,继承是一种机制,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法。继承使我们能够创建一个通用类,然后根据需要扩展或修改它以创建更具体的类。以下是一些关于父类和子类以及它们之间继承关系的基本概念和解释。

一、父类、子类及类的继承关系

1.父类(基类)

  • 父类是一个通用的类,它定义了一组属性和方法,这些属性和方法可以被多个子类共享。
  • 父类通常是较抽象的,表示一个更通用的概念。例如,Animal(动物)类可以是一个父类,表示所有动物的共同属性和行为。

2.子类(派生类)

  • 子类是从父类派生出来的类。它继承了父类的所有属性和方法,但也可以添加自己特有的属性和方法。
  • 子类表示一个更具体的概念。例如,Cat(猫)类和Dog(狗)类可以是从Animal类派生出来的子类,表示具体的动物种类。

3.继承关系

3.1 继承属性和方法

  • 子类继承父类的所有非私有属性和方法。这意味着子类可以直接使用父类中的代码。
  • 子类可以覆盖父类的方法(即方法重写),以提供特定于子类的实现。

3.2 继承的语法

  • 在C#中,使用冒号:来表示继承。

下面是一个示例:

public class Animal
{public string Sound { get; set; }public int Age { get; set; }public string Color { get; set; }
}public class Cat : Animal
{public Cat(){Sound = "Meow";}
}public class Dog : Animal
{public Dog(){Sound = "Woof";}
}

3.3 示例解释

在上面的示例中:

  • Animal类是父类,定义了三个属性:Sound(叫声)、Age(年龄)和Color(颜色)。
  • Cat类和Dog类是从Animal类继承的子类。它们各自有一个构造函数,在创建对象时设置Sound属性的默认值。

3.4 使用继承的优点

  1. 代码重用:

    • 继承允许子类重用父类中的代码,减少了代码的重复,提高了代码的可维护性。
  2. 扩展性:

    • 可以通过继承扩展现有类,而不需要修改原有的代码。这样,系统更容易扩展和维护。
  3. 多态性:

    • 继承是实现多态性的一种手段。通过继承,可以使用父类的引用来指向子类的对象,从而实现不同的行为。

二、代码实现

本次代码基于WPF代码实现观察现象

1.C#代码:MainWindow.xaml.cs

using System;
using System.ComponentModel;
using System.Windows;namespace WpfApp
{// 定义动物基类public class Animal : INotifyPropertyChanged{private string sound; // 动物的叫声private int age;      // 动物的年龄private string color; // 动物的颜色// 动物的叫声属性public string Sound{get { return sound; }set{sound = value;OnPropertyChanged("Sound");}}// 动物的年龄属性public int Age{get { return age; }set{age = value;OnPropertyChanged("Age");}}// 动物的颜色属性public string Color{get { return color; }set{color = value;OnPropertyChanged("Color");}}// 实现INotifyPropertyChanged接口,用于属性改变通知public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}// 定义猫类,继承自动物类public class Cat : Animal{public Cat(){Sound = "Meow"; // 初始化猫的叫声}}// 定义狗类,继承自动物类public class Dog : Animal{public Dog(){Sound = "Woof"; // 初始化狗的叫声}}// 定义羊类,继承自动物类public class Sheep : Animal{public Sheep(){Sound = "Baa"; // 初始化羊的叫声}}// WPF窗口的后台代码public partial class MainWindow : Window{public MainWindow(){InitializeComponent();// 创建动物对象,并设置它们的属性Animal cat = new Cat { Age = 3, Color = "Gray" };Animal dog = new Dog { Age = 5, Color = "Brown" };Animal sheep = new Sheep { Age = 2, Color = "White" };// 将动物对象绑定到WPF窗口的DataContextDataContext = new { Cat = cat, Dog = dog, Sheep = sheep };}}
}

2.XAML代码:MainWindow.xaml

<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Animals" Height="300" Width="300"><Grid><Grid.RowDefinitions><!-- 定义三个行,每个行用于显示一种动物的信息 --><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><!-- 猫的边框 --><Border Grid.Row="0" BorderBrush="Black" BorderThickness="1" Margin="5"><StackPanel><!-- 显示动物种类名称 --><TextBlock Text="Cat" FontWeight="Bold" HorizontalAlignment="Center"/><!-- 绑定并显示猫的叫声 --><TextBlock Text="{Binding Cat.Sound}" /><!-- 绑定并显示猫的年龄 --><TextBlock Text="{Binding Cat.Age}" /><!-- 绑定并显示猫的颜色 --><TextBlock Text="{Binding Cat.Color}" /></StackPanel></Border><!-- 狗的边框 --><Border Grid.Row="1" BorderBrush="Black" BorderThickness="1" Margin="5"><StackPanel><!-- 显示动物种类名称 --><TextBlock Text="Dog" FontWeight="Bold" HorizontalAlignment="Center"/><!-- 绑定并显示狗的叫声 --><TextBlock Text="{Binding Dog.Sound}" /><!-- 绑定并显示狗的年龄 --><TextBlock Text="{Binding Dog.Age}" /><!-- 绑定并显示狗的颜色 --><TextBlock Text="{Binding Dog.Color}" /></StackPanel></Border><!-- 羊的边框 --><Border Grid.Row="2" BorderBrush="Black" BorderThickness="1" Margin="5"><StackPanel><!-- 显示动物种类名称 --><TextBlock Text="Sheep" FontWeight="Bold" HorizontalAlignment="Center"/><!-- 绑定并显示羊的叫声 --><TextBlock Text="{Binding Sheep.Sound}" /><!-- 绑定并显示羊的年龄 --><TextBlock Text="{Binding Sheep.Age}" /><!-- 绑定并显示羊的颜色 --><TextBlock Text="{Binding Sheep.Color}" /></StackPanel></Border></Grid>
</Window>

3.代码解释

  1. C#代码:

    • Animal 类是一个基类,定义了三个属性:Sound(叫声)、Age(年龄)、Color(颜色)。这些属性通过INotifyPropertyChanged接口来通知属性变化。
    • CatDogSheep 类是从 Animal 类继承的子类。它们在构造函数中设置了各自的默认叫声。
    • MainWindow 类是WPF窗口的后台代码。在构造函数中,创建了 CatDogSheep 对象,并设置它们的属性。然后,将这些对象绑定到窗口的 DataContext
  2. XAML代码:

    • 定义了一个 Grid 布局,其中包含三个行,每行用于显示一种动物的信息。
    • 每种动物的信息显示在一个 Border 中, Border 内部是一个 StackPanel
    • StackPanel 包含一个显示动物种类名称的 TextBlock 和三个绑定到动物属性的 TextBlock
    • 通过绑定 (Binding),TextBlock 显示来自 DataContextCatDogSheep 对象的属性值。

4.现象显示

相关文章:

WPF学习(1)--类与类的继承

在面向对象编程中&#xff0c;继承是一种机制&#xff0c;允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类或基类&#xff09;继承属性和方法。继承使我们能够创建一个通用类&#xff0c;然后根据需要扩展或修改它以创建更具体的类。以下是…...

Spring Boot框架的原理及应用详解(六)

本系列文章简介&#xff1a; 在当今的软件开发世界中&#xff0c;快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目&#xff0c;自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性&#xff0c;迅速在Java开发社…...

密码学与信息安全面试题及参考答案(2万字长文)

目录 什么是密码学?它的主要目标是什么? 请解释明文、密文、加密和解密的概念。 密码系统的安全性通常基于哪三种假设? 什么是Kerckhoffs原则?它对现代密码学设计有何意义? 简述密码学中的“混淆”和“扩散”概念。 什么是AES(高级加密标准)?AES有几种常见的密钥…...

C++语法19 循环嵌套结构(for/while循环)

语法阶段已经更新到第18章了&#xff0c;前面的知识你都学会了吗&#xff1f;如果还没有学习前面的知识&#xff0c;请点击&#x1f449;语法专栏进行学习哦&#xff01; 目录 循环嵌套 训练&#xff1a;数字矩形 解析 参考代码 训练&#xff1a;星号三角形 解析 参考代码 …...

AtomicInteger原理和CAS与Synchronized(juc编程)

AtomicInteger原理 4.6.1 原理介绍 AtomicInteger的本质&#xff1a;自旋锁 CAS算法 CAS的全成是&#xff1a; Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作&#xff0c;这…...

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版 接口及参数 打开网页版抖音&#xff0c;右键视频进入详情页。F12打开控制台筛选detail&#xff0c;然后刷新网页&#xff0c;找到请求。可以发现我们本次的参数目标a_bogus。a_bogus有时长度为168有时为172&#xf…...

【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践

文章目录 引言第一章 半监督学习的基本概念1.1 什么是半监督学习1.2 半监督学习的优势 第二章 半监督学习的核心算法2.1 自训练&#xff08;Self-Training&#xff09;2.2 协同训练&#xff08;Co-Training&#xff09;2.3 图半监督学习&#xff08;Graph-Based Semi-Supervise…...

leetcode70 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…...

ENVI实战—一文搞定非监督分类

实验1&#xff1a;使用isodata法分类 目的&#xff1a;学会使用isodata法开展非监督分类 过程&#xff1a; ①导入影像&#xff1a;打开ENVI&#xff0c;按照“文件→打开为→光学传感器→ESA→Sentinel-2”的顺序&#xff0c;打开实验1下载的哨兵2号数据。 图1 ②区域裁剪…...

【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt系统相关 | Qt事件 | 事件的介绍及基本概念 文章编号&#xff1a;Qt…...

具身智能特点及实现路线

多模态——多功能的“小脑” 人类具有眼耳鼻舌身意&#xff0c;说明对于物理世界的充分感知和理解&#xff0c;是意识和智慧的来源。而传统AI更多的是被动观测&#xff0c;主要是“看”&#xff08;计算机视觉&#xff09;和“读”&#xff08;文本NLP&#xff09;&#xff0c…...

重温react-04

兄弟组件之间通信 兄弟1 import React, { Component } from react import pubsub from ./pubsub export default class learnReact01 extends Component {render() {return (<div>我是兄弟1<button onClick{this.clickMessage}>向兄弟2发信息</button><…...

lock-锁的概念

锁的简介 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免发生资源争抢&#xff09; 在并发环境下&#xff0c;多个线程会对同一个资源进行争抢&#xff0c;可能会导致数据不一致的问题。为了解决这一问题&#xff0c;需要通过一种抽象的锁来对资源进行…...

Docker 可用镜像源

当使用 docker 发现拉取不到镜像时&#xff0c;可以编辑 /etc/docker/daemon.json 文件&#xff0c;添加如下内容&#xff1a; 这文章不涉及政治&#xff0c;不涉及敏感信息&#xff0c;三番五次的审核不通过&#xff0c;一删再删&#xff0c;只好换图片了。 重新加载服务配置…...

MySQL 搭建主从报错 1236

错误信息&#xff1a; Last_IO_Error: Got fatal error 1236 from source when reading data from binary log: Could not find first log file name in binary log index file 大致内容&#xff1a; MySQL 在尝试从二进制日志&#xff08;binary log&#xff09;中读取数据…...

华为OD机试真题2024版-求幸存数之和

题目描述\n给一个正整数列 nums,一个跳数 jump,及幸存数量 left。运算过程为:从索引为 0 的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止。然后返回幸存数之和。\n约束: 1、0 是第一个起跳点。…...

Python - 各种计算器合集【附源码】

计算器合集 一&#xff1a;极简版计算器二&#xff1a;简易版计算器三&#xff1a;不简易的计算器四&#xff1a;还可以计算器 一&#xff1a;极简版计算器 运行效果&#xff1a; import tkinter as tk import tkinter.messagebox win tk.Tk() win.title("计算器")…...

【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条

总结 需要安装插件 mouse-wheel 和 scrollbar 在PC端如何开启鼠标滚动? 需要安装官方提供的滚动插件&#xff1a;mouse-wheel https://better-scroll.github.io/docs/zh-CN/plugins/mouse-wheel.html 为了开启鼠标滚动功能&#xff0c;你需要首先引入 mouseWheel 插件&…...

AJAX 综合案例-day2

Bootstrap 弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 1. 引入 bootstrap.css 和 bootstrap.js 2. 准备 弹框标签 &#xff0c;确认结构 3. 通过 自定义属性 &#xff0c;控制弹框的 显示 和 隐藏 1. 通过属性…...

【Esp32连接微信小程序蓝牙】附Arduino源码《 返回10007 相同特征id冲突问题》

前言 最近接了一个外包&#xff0c;发现了esp32连接小程序会有很多bug&#xff0c;所以接下来会慢慢更新解决方案&#xff0c;还是需要多接触项目才能进步呀兄弟们&#xff01; 附上uuid的生成链接&#xff1a; // See the following for generating UUIDs: // https://www.uu…...

并发控制技术

事物的隔离性实现主要依赖于多种并发控制技术,这些技术确保在并发执行的事物中,一个事物的操作不会被其他事物干扰。并发控制技术按照其对可能冲突的操作采取的不同策略可以分为乐观并发控制和悲观并发控制两大类。 基于封锁的并发控制 对于并发可能冲突的操作,比如读-写,…...

什么是网段

一、A类地址的网段&#xff1a; 情况1&#xff1a;最小的网段就是xxx.0.0.0&#xff0c;直接使用第一段的网络地址做网段。 情况2&#xff1a;如果希望网段允许的主机数量的范围缩小&#xff0c;扩大网段值即可&#xff0c;xxx.xxz.zzz.zzz&#xff0c;比如xxx.xxx.xzz.zzz&…...

PHP和Mysql前后端交互效果实现

一、连接数据库基本函数 mysqli_connect(); 作用&#xff1a;创建数据库连接&#xff0c;打开一个新的mysql的连接。传参顺序&#xff1a;数据库地址、数据库账号、数据库密码 <?phpecho mysqli_connect("localhost",root,root) ?> /*结果&#xff1a;F…...

vue小总结

知识总结 【 1 】es6 语法总结 # let 定义变量 # const定义常量 ------块级作用域---- # var 以后尽量少用&#xff0c;函数作用域var 在 JavaScript 中是函数作用域或全局作用域。而 let 和 const 是块级作用域。 // 使用 var 声明全局变量 var globalVar "Im a globa…...

RapidLayout:中英文版面分析推理库

引言 继上一篇文章之后&#xff0c;我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中&#xff0c;便于大家快速使用。 不曾想到&#xff0c;我这整理工作越做越多了&#xff0c;好在整体都是往更好方向走。 起初&#xff0c;rapid_layout项目是在RapidStru…...

postman 工具下载安装使用教程_postman安装

本文讲解的是postman工具下载、Postman安装步骤、postman下载、postman安装教程。Postman是一款流行的API测试工具&#xff0c;它提供了一个用户友好的界面&#xff0c;用于发送和测试API请求&#xff0c;并且可以轻松地按需管理和组织请求。 这使得开发人员和测试人员能够更高…...

【数学建模】——【新手小白到国奖选手】——【学习路线】

专栏&#xff1a;数学建模学习笔记 目录 ​编辑 第一阶段&#xff1a;基础知识和工具 1.Python基础 1.学习内容 1.基本语法 2.函数和模块 3.面向对象编程 4.文件操作 2.推荐资源 书籍&#xff1a; 在线课程&#xff1a; 在线教程&#xff1a; 2.数学基础 1.学习内…...

CSS文本超限后使用省略号代替

方案一&#xff1a; 只显示一行&#xff0c;超限后使用省略号代替 .detail {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }方案二&#xff1a; 显示多行&#xff0c;到最后一行还没有显示完&#xff0c;则最后一行多出来的部分使用省略号代替。 .detai…...

多线程下JVM内存模型 和 volatile关键字

1、线程的概念 线程&#xff08;thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务…...

Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置

思路&#xff1a;运用uniapp原生提供方法uni.createSelectorQuery()获取滚动对应节点的信息&#xff0c;即节点距离页面顶部的距离&#xff0c;再通过uniapp原生监听页面滚动事件onPageScroll&#xff0c;获取页面内容滚动的高度&#xff0c;二者相加即定位到对应节点的滚动距离…...

在线做免费网站/平台怎么推广

2019独角兽企业重金招聘Python工程师标准>>> MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。 MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优…...

漯河哪里做网站/成都最新数据消息

来源&#xff1a;编程新说“中国最好面试官”自从上次写了一篇“【面试】我是如何面试别人List相关知识的&#xff0c;深度有点长文”的文章后&#xff0c;有读者专门加我微信&#xff0c;说我是“中国最好面试官”&#xff0c;这个我可受不起呀。我只是希望把面试当作是一次交…...

网站百度权重没有数据/网络营销章节测试答案

64位系统是能安装32位的应用软件和程序的&#xff0c;出现问题&#xff0c;最大可能是没有安装 32位的依赖库&#xff0c;或者是安装的32位依赖库不对。 linux一般都是在/etc/dpkg/dpkg.cfg.d/路径下有相关的文件 该目录下multiarch文件就记录foreign-architecture 注意&…...

小游戏制作软件/重庆seo俱乐部联系方式

E. 深度学习 — 生成式对抗网络&#xff08;GAN&#xff09; 之概述 概述 组成部分 Generator&#xff1a;类似 encoder无法学习 component 和 component 之间的关系Discriminator&#xff1a;类似 Seq2Seq 的Decoder 类比 Teacher - Student伪钞制作者 - 警察 Uncondition…...

设计网站页面要多少钱/电工培训机构

一、总概 对于微信小程序整个开发框架而言&#xff0c;其程序中包含一个描述整体程序 App 和多个描述各自页面的 pages 对于微信小程序来说&#xff0c;一个小程序主体部分由三个文件构成如下表所示 页面的开发都放在文件夹pages中&#xff0c;log文件夹是微信小程序自动生成的…...

网站上的视频/哪些网站可以免费申请域名

A.这主要看你互斥锁锁的资源是那部分的&#xff0c;如果是进程内资源&#xff0c;则可以实现同一进程不同线程之间的互斥&#xff0c;而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。 B.这是必然的&#xff0c;加锁是为了防止数据的二义性 C.信号量同时使…...