WPF学习(3)--不同类通过接口实现同种方法

news2024/11/25 4:21:55

一、接口概述

1.接口的概念

在C#中,接口(interface)是一种引用类型,它定义了一组方法、属性、事件或索引器,但不提供实现。接口只定义成员的签名,而具体的实现由实现接口的类或结构体提供。接口使用关键字 interface 定义。

接口实例

public interface IShape
{
    double GetArea();
    double GetPerimeter();
    string GetInfo();
}

类实现接口实例

public class Circle : IShape
{
    public double Radius { get; set; }

    public Circle(double radius)
    {
        Radius = radius;
    }

    public double GetArea()
    {
        return Math.PI * Radius * Radius;
    }

    public double GetPerimeter()
    {
        return 2 * Math.PI * Radius;
    }

    public string GetInfo()
    {
        return $"Circle - Radius: {Radius}, Area: {GetArea():F2}, Perimeter: {GetPerimeter():F2}";
    }
}

2.使用接口的好处

  • 解耦和可替换性

    • 接口定义了行为的契约,而不关心具体的实现。这样,代码依赖于接口而不是具体实现,使得具体实现可以很容易地替换或修改而不影响使用接口的代码。
  • 提高代码的可测试性

    • 接口使得代码更容易进行单元测试。我们可以为接口创建模拟(Mock)对象,测试代码可以使用这些模拟对象来独立验证逻辑,而不需要依赖具体实现。

二、实例代码分析

1.Shapes.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp
{
    public interface IShape
    {
        double GetArea();
        double GetPerimeter();
        string GetInfo();
    }

    public class Circle : IShape
    {
        public double Radius { get; set; }

        public Circle(double radius)
        {
            Radius = radius;
        }

        public double GetArea()
        {
            return Math.PI * Radius * Radius;
        }

        public double GetPerimeter()
        {
            return 2 * Math.PI * Radius;
        }

        public string GetInfo()
        {
            return $"Circle - Radius: {Radius}, Area: {GetArea():F2}, Perimeter: {GetPerimeter():F2}";
        }
    }

    public class Rectangle : IShape
    {
        public double Width { get; set; }
        public double Height { get; set; }

        public Rectangle(double width, double height)
        {
            Width = width;
            Height = height;
        }

        public double GetArea()
        {
            return Width * Height;
        }

        public double GetPerimeter()
        {
            return 2 * (Width + Height);
        }

        public string GetInfo()
        {
            return $"Rectangle - Width: {Width}, Height: {Height}, Area: {GetArea():F2}, Perimeter: {GetPerimeter():F2}";
        }
    }
}

2.MainWindow.xmal.cs

using System;
using System.Collections.Generic; // 用于 List<T>
using System.ComponentModel; // 用于 INotifyPropertyChanged 接口
using System.Windows; // 用于 WPF 相关类

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        // 存储形状的列表
        List<IShape> Shapes;
        
        // 存储形状信息的对象,用于数据绑定
        private ShapeInfo MyShapeInfo;

        // 构造函数,初始化组件和数据
        public MainWindow()
        {
            InitializeComponent();
            Shapes = new List<IShape>();
            MyShapeInfo = new ShapeInfo();
            MyShapeInfo.Info = ""; // 初始化 Info 属性
            DataContext = new { ShapeInfo = MyShapeInfo }; // 设置数据上下文
        }

        // 添加圆形按钮的点击事件处理程序
        private void Button_Click_AddCircle(object sender, RoutedEventArgs e)
        {
            double radius = DateTime.Now.Second; // 使用当前秒数作为圆的半径
            Circle circle = new Circle(radius); // 创建新的 Circle 对象
            Shapes.Add(circle); // 将 Circle 对象添加到列表中
        }

        // 添加矩形按钮的点击事件处理程序
        private void Button_Click_AddRectangle(object sender, RoutedEventArgs e)
        {
            double height = DateTime.Now.Second; // 使用当前秒数作为矩形的高度
            double width = height / 2; // 使用当前秒数的一半作为矩形的宽度
            Rectangle rectangle = new Rectangle(width, height); // 创建新的 Rectangle 对象
            Shapes.Add(rectangle); // 将 Rectangle 对象添加到列表中
        }

        // 显示形状信息按钮的点击事件处理程序
        private void Button_Click_ShowInfo(object sender, RoutedEventArgs e)
        {
            string info = "";
            // 遍历所有形状,获取其信息
            foreach (IShape shape in Shapes)
            {
                if (shape != null)
                {
                    info += shape.GetInfo(); // 获取形状信息
                    info += Environment.NewLine; // 添加换行符
                }
            }
            MyShapeInfo.Info = info; // 更新 ShapeInfo 对象的 Info 属性
            ShapesInfo.Text = MyShapeInfo.Info; // 更新 UI 中显示的信息
        }
    }

    // 用于存储和通知形状信息变化的类
    public class ShapeInfo : INotifyPropertyChanged
    {
        // 私有字段,存储信息字符串
        private string _info;

        // 公有属性,获取或设置信息字符串
        public string Info
        {
            get { return _info; }
            set
            {
                _info = value;
                OnPropertyChanged("Info"); // 通知属性值变化
            }
        }

        // 属性变化事件
        public event PropertyChangedEventHandler PropertyChanged;

        // 触发属性变化事件的方法
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

3.MainWindow.xmal

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Shape Info" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Content="Add Circle" Click="Button_Click_AddCircle" Margin="10"/>
            <Button Content="Add Rectangle" Click="Button_Click_AddRectangle" Margin="10"/>
            <Button Content="Show Shapes Info" Click="Button_Click_ShowInfo" Margin="10"/>
            <TextBlock Name="ShapesInfo" Margin="10" FontSize="16" TextWrapping="Wrap" Text="{Binding ShapeInfo.Info}"  />
        </StackPanel>
    </Grid>
</Window>

三、实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1818992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tita 360评估:有效 360度反馈流程的 10 大步骤

宣传过程 如果你的公司首次引入多方位反馈或 360 度反馈&#xff0c;那么向所有利益相关者描述这一流程至关重要。由于流程太新&#xff0c;很多人还不了解。确保参与该流程的每个人都了解其目的&#xff0c;以及将如何实施该流程和使用其结果。花时间在一对一会议、小组会议和…

6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)

题目 448找到所有数组中消失的数字.go 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,…

后仿真中《SDF反标必懂连载篇》之 <INTERCONNECT/IOPATH> 庐山面目

对于SDF INTERCONNECT ENTRY 描述&#xff0c;我们在之前的文章有详解。 读万卷书&#xff0c;行万里路。 实践很重要。 今天&#xff0c;搞一下SDF INTERCONNECT / IOPATH 延迟数据信息&#xff0c;究竟反标的是哪一路径延时&#xff1f; 一 IOPATH (CELL(CELLTYPE …

STM32F103C8T6 IAP升级

目录 0x00 前言0x01 flash分区0x02 Bootloader0x02 APP设置0x03 升级程序编写0x04 固件烧录 0x00 前言 STM32有三种烧录程序的方式&#xff1a;烧录器下载、拉高boot1进行串口下载(ISP)还有通过在 Bootloader中进行flash擦除和写入(IAP)。 在进行开发之前&#xff0c;你需要了…

上海晋名室外危废品暂存柜助力储能电站行业危废品安全储存

近日又有一台SAVEST室外危废暂存柜项目成功验收交付使用&#xff0c;此次项目主要用于储能电站行业废油、废锂电池等危废品的安全储存。 用户单位在日常工作运营中涉及到废油、废锂电池等危废品的室外安全储存问题。4月中旬用户技术总工在寻找解决方案的过程中搜索到上海晋名的…

蒂姆·库克解释Apple Intelligence和与ChatGPT合作的区别|TodayAI

在2024年全球开发者大会&#xff08;WWDC 2024&#xff09;上&#xff0c;苹果公司首席执行官蒂姆库克&#xff08;Tim Cook&#xff09;隆重介绍了公司的最新人工智能&#xff08;AI&#xff09;计划——Apple Intelligence&#xff0c;并宣布了与OpenAI的ChatGPT的合作。虽然…

突破管理瓶颈:基于前端技术的全面预算编制系统解析

前言 在现代商业环境中&#xff0c;预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而&#xff0c;由于市场的不断变化&#xff0c;准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战&#xff0c;建立一个高效的系统来管理和审查销售数据的重…

展位展台设计要注意的问题

1、选择专业的展台设计公司 特装比一般展位设计更要保证展台的独特性&#xff0c;更具可塑性。任何疑问和要求都能得到专业的解答。不论是展台的整体结构&#xff0c;还是展台搭建材料&#xff0c;都能实现良好的沟通&#xff0c;两方面都可以确保参加展会的双赢。 2、缜密的展…

智能家居建材,打造未来家居生活

智能家居建材&#xff0c;正引领着家居行业的新潮流。它融合了先进的科技与人性化的设计&#xff0c;为我们打造了一个充满未来感的家居新体验。 想象一下&#xff0c;当你走进家门&#xff0c;智能门锁自动识别你的身份&#xff0c;轻轻一推即可进入。室内环境自动调节到最舒适…

生成式人工智能 - 本地windows 11 + PyCharm运行stable diffusion流程简述

一、环境说明 硬件:本地电脑windows11、32.0 GB内存、2060的6G的卡。 软件:本地有一个python环境,主要是torch 2.2.2+cu118 二、准备工作 1、下载模型 https://huggingface.co/CompVishttps://huggingface.co/CompVis 进入上面的网址,我这里下载的是这个里面的 …

达到1k stars后,我对大模型开源教程的反思!(附教程)

前 言 “五一”节后第一个开心的消息是我们开源的大模型基础项目(https://github.com/datawhalechina/so-large-lm)已经达到1k stars⭐️了。这个开源项目是为了提供浅显易懂且前沿的大模基础知识而打造的&#xff0c;能收获1k个stars⭐️也是对这个项目的肯定。我为一起付出努…

软考初级网络管理员_07_网络单选题

1.观察交换机状态指示灯初步判断交换机故障&#xff0c;交换机运行中指示灯显示红色表示()。 警告 正常 待机 繁忙 2.通常测试网络连通性采用的命令是()。 Netstat Ping Msconfig Cmd 3.一台16端口的交换机可以产生&#xff08;&#xff09;个冲突域? 1 4 15 16…

诊所管理系统如何重塑患者就医流程

随着信息技术的快速发展&#xff0c;诊所管理系统的应用正在为医疗服务带来革命性的变化。这一系统不仅仅是一种管理工具&#xff0c;更是一种全方位的健康管理解决方案&#xff0c;从诊前、诊中到诊后&#xff0c;为患者提供了一系列便捷、高效的服务&#xff0c;让患者的就医…

Java代码实现获取一个文件夹下所有文件名并输出到指定的txt文件中

当一个文件夹中文件过多时&#xff0c;且需要知道次序跟名称时&#xff0c;下面用一段Java代码来实现&#xff1a; 输出一个文件夹内所有的文件名并在前面标上序号&#xff0c;输出到一个文本文件中 最终效果 序号文件名列表 完整代码 import java.io.File; import java.i…

PostgreSql中使用to_char函数、date()函数可能会导致索引无法充分利用,导致查询速度无法提升

今天在处理接口请求速度慢的问题&#xff0c;惊奇的发现加了索引&#xff0c;但还是请求很忙。由于card_stop_info表有300w条数据&#xff0c;这时候关联查询非常慢&#xff0c;于是我加上匹配项索引&#xff0c;但是发现依然没有改变速度。。这时候去搜了一下才知道pgsql的to_…

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…

比人工快100倍!给3D模型用上轻量化,老爷机也能起飞!!!!!!

3D可视化开发&#xff0c;考虑最多的要素&#xff0c;当属模型加载流畅度和应用性。但面对单位的电脑、不能升级硬盘的笔记本等&#xff0c;可能还是无法体会到模型丝滑加载的畅快。 况且3D模型数据、格式等&#xff0c;也在不断发展扩充&#xff0c;昔日手工就能“调教”的3D…

CSS Flexbox(弹性布局)

目录 &#x1f587;️什么是弹性布局&#xff1f; &#x1f587;️容器属性 ○ flex-direction ○ justify-content ○ align-items ○ flex-warp ○ align-content &#x1f587;️项目属性 ○ order ○ flex &#x1f587;️总结 提示: 如果你是小白&#xff0c;不…

CentOS7安装nginx【巨详细】

CentOS7安装nginx 安装依赖 1.安装gcc&#xff0c;nginx 编译时依赖 gcc 环境 # 安装c yum install gcc-c# 查看版本 gcc -v正常情况显示如下 2.安装openssl 安全套接字层密码库&#xff0c;用于通信加密 yum install -y openssl openssl-devel3.安装zlib,zlib 库 提供了很多…

linux搭建sftp服务

1. 添加用户及用户组 使用 groupadd sftpgroup 添加sftpgroup 用户组&#xff1b; 使用useradd -G sftpgroup -s /sbin/nologin cmssftp给sftpgroup 添加cmssftp用户&#xff1b; 使用passwd cmssftp给用户cmssftp进行设置密码(默认为:654321)。具体如下图所示&#xff1a; 2.…