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

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

码农世界 2024-06-14 后端 115 次浏览 0个评论

一、接口概述

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
    using System.ComponentModel; // 用于 INotifyPropertyChanged 接口
    using System.Windows; // 用于 WPF 相关类
    namespace WpfApp
    {
        public partial class MainWindow : Window
        {
            // 存储形状的列表
            List Shapes;
            
            // 存储形状信息的对象,用于数据绑定
            private ShapeInfo MyShapeInfo;
            // 构造函数,初始化组件和数据
            public MainWindow()
            {
                InitializeComponent();
                Shapes = new List();
                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

    
        
            
                

    三、实验结果

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

转载请注明来自码农世界,本文标题:《WPF学习(3)--不同类通过接口实现同种方法》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,115人围观)参与讨论

还没有评论,来说两句吧...

Top