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

一、接口概述

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.mfbz.cn/a/705499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

场外期权能不能开户?场外期权在哪里开?

今天带你了解场外期权能不能开户&#xff1f;场外期权在哪里开&#xff1f;近年来&#xff0c;场外期权交易在金融市场上逐渐盛行起来。有许多人对于场外期权的开户问题感到困惑。 场外期权能不能开户&#xff1f; 资质要求&#xff1a; 个人投资者需要具备一定的金融知识和投…

非阻塞IO简介和代码实例

接上篇 阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介-CSDN博客文章浏览阅读90次。阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介https://blog.csdn.net/CSDN_DU666666/article/details/139598410?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%2…

什么是电脑监控软件?六款知名又实用的电脑监控软件

电脑监控软件是一种专为监控和记录计算机活动而设计的应用程序&#xff0c;它能够帮助用户&#xff08;如家长、雇主或系统管理员&#xff09;了解并管理目标计算机的使用情况。这些软件通常具有多样化的功能&#xff0c;包括但不限于屏幕捕捉、网络行为监控、应用程序使用记录…

JUnit5学习笔记

1.JUnit5的变化 JUnit 5 JUnit Platform JUnit Jupiter JUnit Vintage JUnit Platform: Junit Platform是在JVM上启动测试框架的基础&#xff0c;不仅支持Junit自制的测试引擎&#xff0c;其他测试引擎也都可以接入。 JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模…

『原型资源』Axure自带图标库不够用,第三方经典图标库来袭

​今天小编为大家带来第三方经典图标库&#xff0c;己确认内容可用现推荐给大家。直接上手就可不用自己画哈~ 获取原型文档请与班主任联系&#xff01; 先睹为快&#xff0c;合适再拿走不谢&#xff1a; 图标太多&#xff0c;截取部分给大家参考o(*&#xffe3;︶&#xffe3;*…

恭喜!X医生斩获英国伦敦大学学院访问学者邀请函

伦敦大学学院&#xff08;University College London&#xff0c;简称&#xff1a;UCL&#xff09;&#xff0c;1826年创立于英国伦敦&#xff0c;是一所公立研究型大学。伦敦大学联盟的创校学院、罗素大学集团和欧洲研究型大学联盟创始成员&#xff0c;也是金三角名校和G5之一…

东胜物流软件 GetProParentModuTreeList SQL注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…

雷军出手,光储充一体化赛道可太行了

雷军出手&#xff0c;特斯拉、宁德时代、奥能电源持续加码&#xff0c;光储充一体化赛道可太行了 近几年&#xff0c;各地光储充一体化项目遍地开花&#xff0c;正式投入运营的新闻接连不断。被视为全球能源转型重要驱动力的光储充一体化&#xff0c;已成为各大企业竞相入局的新…

复合机器人以其高度的灵活性和操作效率,展现了显著的优势

随着工业4.0的深入推进和智能制造的快速发展&#xff0c;复合机器人作为一种集成移动机器人和工业机器人功能的先进设备&#xff0c;正逐步成为工业自动化领域的新宠。特别是在磁钢上下料的应用中&#xff0c;复合机器人以其高度的灵活性和操作效率&#xff0c;展现了显著的优势…

【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; 数据清洗&#x1f49e; 数据变换&#x1f49e; 数据归一化&#x1f49e; 高级预处理技术&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; 特征选择&…

PFC旁路二极管、继电器驱动电路以及PFC主功率

R001和R002以及R003三个电阻作用是限放X电容上的电 整流桥串联两个BJ1和BJ2 电容C3:给整流桥储能&#xff0c;给后续llc供电 PFC工作是正弦波上叠加高频电流 PFC功率部分 2个PFC电感&#xff08;选择两个磁芯骨架小&#xff0c;有利于散热&#xff09;、2个续流二极管&…

软件游戏提示msvcp140.dll丢失的原因分析及解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“计算机缺失msvcp140.dll”。那么&#xff0c;这个错误是什么意思呢&#xff1f;它会造成哪些问题&#xff1f;小编将从以下几个方面进行详细解析。 一&#xff0c;了解msvcp140.dll是什么 …

虚拟化 之一 详解 jailhouse 架构及原理、软硬件要求、源码文件、基本组件

Jailhouse 是一个基于 Linux 实现的针对创建工业级应用程序的小型 Hypervisor&#xff0c;是由西门子公司的 Jan Kiszka 于 2013 年开发的&#xff0c;并得到了官方 Linux 内核的支持&#xff0c;在开源社区中获得了知名度和吸引力。 Jailhouse Jailhouse 是一种轻量级的虚拟化…

解决使用elmessage 没有样式的问题

错误情况 这里使用了一个消息提示&#xff0c;但是没有出现正确的样式&#xff0c; 错误原因和解决方法 出现这种情况是因为&#xff0c;在全局使用了按需导入&#xff0c;而又在局部组件中导入了ElMessage组件&#xff0c;我们只需要将局部组件的import删除就可以了 import…

企业商家如何精明选择软件开发公司

在当今信息化社会&#xff0c;企业的运营和发展已经离不开软件系统的支持。而选择一个合适的软件开发公司&#xff0c;则成为了企业商家在信息化道路上的一大挑战。那么&#xff0c;究竟如何挑选出既符合业务需求&#xff0c;又能保障项目成功的软件开发公司呢&#xff1f; 明…

MySQL查询数据库中所有表名表结构及注释以及生成数据库文档

MySQL查询数据库中所有表名表结构及注释 生成数据库文档在后面&#xff01;&#xff01;&#xff01; select t.TABLE_COMMENT -- 数据表注释 , c.TABLE_NAME -- 表名称 , c.COLUMN_COMMENT -- 数据项 , c.COLUMN_NAME -- 英文名称 , -- 字段描述 , upper(c.DATA_TYPE) as …

为什么要用AI大模型?

前言 2021 年 8 月份&#xff0c;李飞飞和 100 多位学者联名发表一份 200 多页的研究报告《On the Opportunities and Risk of Foundation Models》&#xff0c;深度地综述了当前大规模预训练模型面临的机遇和挑战。 语言模型已经深刻变革了自然语言处理领域的研究和实践。近…

20240613每日前端-------vue3实现聊天室(二)

看效果图&#xff1a; 今天具体讲下&#xff0c;聊天消息框的布局&#xff1a; 消息框大致分为两块&#xff1a; 别人发来的消息自己发出的消息 元素如下&#xff1a; 头像消息发送人发送时间 html代码设计如下&#xff1a; 整体先用一个div作为外边框&#xff0c;观察上面…

告别“人治”时代,物业运维平台能否成为行业新标准?

随着数字化时代的飞速发展&#xff0c;智能化、数字化已经遍及所有的行业。物业服务企业也不例外&#xff0c;你是否还在想象物业运维工作依旧停留在手动报修、纸质记录的古老时代&#xff1f;那么&#xff0c;你就OUT了&#xff0c;物业运维平台已经悄然崛起&#xff0c;正在以…

RuoYi: 企业级快速开发平台

目录 前言1 项目介绍1.1 简介1.2 特性 2 技术选型3 功能方面4 代码解释4.1 控制器层示例4.2 服务层示例4.3 数据访问层示例 4 推荐理由4.1 高效开发4.2 灵活性和扩展性4.3 完善的功能和安全性4.4 活跃的开源社区 结语 前言 在现代企业级应用开发中&#xff0c;高效、稳定、安全…