为现有类创建接口?

2024-01-12

I use a Model在屏幕上绘制一些系列。您可以创建一个系列,例如LineSeries or CurveSeries并将它们添加到模型中:Model.Series.Add(myLineSeries);。该系列有一个属性Points,其中保存了所有点,您可以轻松添加一些:myLineSeries.Points.Add(...);. Model获取从基类继承的所有系列Series.

但是当我将它添加到模型并想稍后添加一些点时,我必须将其转换回来:

//Model.Series[0].Points does not exists. I have to cast them...

var lineSeries = (Model.Series[0] as LineSeries);

if(lineSeries != null)
    lineSeries.Points.Add(...);

var curveSeries = (Model.Series[0] as CurveSeries);
//Same code for CurveSeries

//Same code for other series types...

所以我必须一遍又一遍地执行相同的代码。如果您可以访问源代码,您可以说:让我们创建一个“点接口”或一个基类,其中所有属性都具有点。系列只需继承基类或接口即可。现在你可以说:

var Series = (Model.Series[0] as IPointSeries);

//Code only one time :)

但现在我无法访问系列和模型的源代码。我无法更改模型、系列或抽象系列基类的实现。

有没有一种通用的方法可以在不更改模型或系列的源代码的情况下执行此操作?喜欢为现有系列创建一个界面来以相同的方式访问它们吗?


您可以编写一组包装类,这样至少您不必多次编写了解多种基础类型的所有代码。

例如:

public class PointSeries
{
    public List<Point> Points { get { return new List<Point>(); } }
}

public class CurveSeries
{
    public List<Point> Points { get { return new List<Point>(); } }
}

public interface ISeriesWrapper
{
    List<Point> Points { get; }
}

public class PointSeriesWrapper : ISeriesWrapper
{
    public PointSeriesWrapper(PointSeries series)
    {
        _Series = series;
    }

    private PointSeries _Series;

    public List<Point> Points { get { return _Series.Points; } }
}

public class CurveSeriesWrapper : ISeriesWrapper
{
    public CurveSeriesWrapper(CurveSeries series)
    {
        _Series = series;
    }

    private CurveSeries _Series;

    public List<Point> Points { get { return _Series.Points; } }
}

public static class SeriesWrapper
{
    public static ISeriesWrapper Create(object series)
    {
        var pointSeries = series as PointSeries;
        if (pointSeries != null)
            return new PointSeriesWrapper(pointSeries);

        var curveSeries = series as CurveSeries;
        if (curveSeries != null)
            return new CurveSeriesWrapper(curveSeries);

        throw new NotSupportedException();
    }
}

使用示例:

var pointSeries = SeriesWrapper.Create(Model.Series[0]);
lineSeries.Points.AddRange(pointSeries.Points);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为现有类创建接口? 的相关文章

  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 以 ISO 8601 格式输出日期

    如何在 C 中获取以下格式的日期 2016 04 26T19 50 48Z include
  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • javascript 中的工厂模式与构造函数模式[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我看到了关于 javascript 设计模式的教程 虽然教程很好 但它给我留下了很少的问题 正如我所见 工厂和构造函数产生相同的结果
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • 将自定义类型转换注入 .NET 库类

    我想通过C 中的Convert ChangeType实现两个库类之间的转换 我无法改变这两种类型 例如 Guid 和 byte 之间的转换 Guid g new Guid object o1 g byte b byte Convert Ch
  • 在 Laravel 5.x 中组织 trans() 本地化文件的好策略有哪些?

    这是一个关于方法论和建议实践的问题 我知道它并没有严格依附于框架 甚至不是 PHP 答案可能是 这取决于你 但我关心的是最佳实践和方法 因为通常存在针对特定环境的最佳方法 我想知道哪些是最佳实践键命名为了trans 的函数Laravel 5
  • 在 Linux 中禁用网络摄像头自动对焦

    我正在 beagleboard 的嵌入系统中工作 源代码是Python的 但我从OpenCV导入库来进行图像处理 实际上 我使用的是 Logitech c910 网络摄像头 它是一款出色的摄像头 但它具有自动对焦功能 我想知道是否可以从 P
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 在mongoDB的一个文档中插入多个json文件

    我有个问题 但是如何在一个文档集合中插入许多 json 文件呢 我有一个与 mongoDB 连接的 ruby 脚本 它为每个 ID 产品生成 json 文件 在 mongo 中我应该想要一个像这样的结构 Id document s name
  • 上传php时重命名图像文件

    我有一个用于上传图像的表格 index html 将数据提交到 resizer php 编码如下 索引 html
  • 如何将 dict_values 转换为集合

    我有一个dict包含集合作为每个键的值 例如 key1 8772 9605 key2 10867 10911 10917 key3 11749 11750 key4 14721 19755 21281 现在我想把每个值 即一组int变成一个
  • PHP 会话过期过早

    我遇到一个问题 我的应用程序会话在大约 15 分钟后意外过期 我需要它们在 4 小时后过期 服务器是Centos 5 5 PHP是5 3 2 下面是我的代码 包含在全局标头中
  • 图像大小应该在 img 标签高度/宽度属性中定义还是在 CSS 中定义? [复制]

    这个问题在这里已经有答案了 在中定义图像大小是否更好的编码实践img tag s width and height属性 img src images academia vs business png width 740 height 382
  • PHP MySQL 生成唯一的随机数

    我不明白为什么我的代码不起作用 连接工作正常 其他一切都正常 但是当我尝试生成一个唯一的随机数并从 MySQL 检查该数字是否存在时 它仍然打印出一个随机数 但它不是唯一的 有人可以帮助我吗 这是我的代码 num rand 1 5 sel
  • 如何正确克隆(jQuery)通过 PIE 应用样式的元素?

    我一直在使用 htc的版本PIE http css3pie com在一个新项目 专门针对 IE8 上成功 但是 在尝试克隆应用了 PIE 样式的元素时遇到了麻烦 我有一个 jsfiddle 说明了问题here http jsfiddle n
  • node.js:child_process.exec()的回调函数有没有办法返回进程PID

    Node JS 执行问题 我有一个生成多个进程的程序 我想通过在进程完成时捕获 PID 来记录进程完成的顺序 据我所知 标准回调不包括 PID stdout stderr 和错误 我想避免使用spawn 但看起来我必须这样做 除非任何善良的
  • mysql 连接。我应该在每次事务之前保持它的活动状态还是启动一个新连接?

    我正在第一次尝试 mysql 我对如何处理我的应用程序的连接有疑问 我现在正在做的是打开一个连接并保持它的活动状态 直到我终止我的程序 我时不时地执行一次 mysql ping 并使用 MYSQL OPT RECONNECT 启动连接 另一
  • 如何使用rails中的form_tag方法在params中传递参数

    我正在尝试传递一个参数params tab gt drive 在 car path 方法中使用 form tag 但它在 car path 参数中不可用 这就是我正在尝试的 有点不同的想法 使用 a 不是更好吗 隐藏字段 http api
  • 在这种情况下,“动态声明的字段”是什么意思?

    我对 OOP 和 PHP 还很陌生 我正在使用 IDE PhpStorm 它给了我这个 见下文 关于我参考的警告 width 这是我的代码 我以前从未见过 字段 一词 并且我不完全确定 动态声明字段 这句话的含义 看来这个警告是我今天更新
  • 面向对象设计中的方法

    Q1 在我大学的面向对象建模和设计研究中 他们建议思考对象可以为其方法做什么 以及它对其属性的责任是什么 所有澄清的尝试都导致了进一步的混乱 这往往会生成一个类图 其中包含具有所有操作的参与者和仅保存数据的内部类 这似乎不正确 是否有另一种
  • CFDocument 仍然会截断某些页面上的文本顶部

    当使用 cfdocument 时 我们的某些页面的顶行被切断 使其无法阅读 我知道 7 中有一个错误 据说在 8 中已修复 我们正在使用 8 0 1 195765 但问题仍然存在 我所有的搜索都将我引向 CF7 有人有主意吗
  • Chartjs 在饼图上显示值

    我正在使用 ChartJS 并尝试将数据对象中的数据数组的值添加到图表中 我的意思是 如果数据数组看起来像这样 1 4 5 则相关部分的饼图上将显示该值 因此 在本例中 最大的 饼图切片 应为数字 6 目前 仅当您将鼠标悬停在饼图上时 它才
  • 重载原始类型的运算符<<。那可能吗?

    嘿 是否可以为原始类型重载operator std ostream operator lt lt std ostream strm int i strm lt lt i lt lt std endl return strm 但它不起作用 我
  • 为现有类创建接口?

    I use a Model在屏幕上绘制一些系列 您可以创建一个系列 例如LineSeries or CurveSeries并将它们添加到模型中 Model Series Add myLineSeries 该系列有一个属性Points 其中保