C#:将基类转换为子类

2024-01-18

我有一个类 NetworkClient 作为基类:

using System.IO;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace Network
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class NetworkClient
{
    public NetworkClient()
    {
        tcpClient = new TcpClient();
    }
    public NetworkClient(TcpClient client)
    {
        tcpClient = client;
    }

    public virtual bool IsConnected
    {
        get;
        private set;
    }
    private StreamWriter writer { get; set; }
    private StreamReader reader { get; set; }

    private TcpClient tcpClient
    {
        get;
        set;
    }

    public virtual NetworkServerInfo NetworkServerInfo
    {
        get;
        set;
    }

    public async virtual void Connect(NetworkServerInfo info)
    {
        if (tcpClient == null)
        {
            tcpClient=new TcpClient();
        }
        await tcpClient.ConnectAsync(info.Address,info.Port);
        reader = new StreamReader(tcpClient.GetStream());
        writer = new StreamWriter(tcpClient.GetStream());
    }

    public virtual void Disconnect()
    {
        tcpClient.Close();            
        reader.Dispose();

        writer.Dispose();
    }

    public async virtual void Send(string data)
    {
        await writer.WriteLineAsync(data);
    }

    public async virtual Task<string> Receive()
    {
        return await reader.ReadLineAsync();
    }

}
}

并且还有一个从 NetworkClient 派生的子类:

using System.Net;

namespace Network
{
using Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class SkyfilterClient : NetworkClient
{
    public virtual IPAddress Address
    {
        get;
        set;
    }

    public virtual int Port
    {
        get;
        set;
    }

    public virtual string SessionID
    {
        get;
        set;
    }

    public virtual User UserData
    {
        get;
        set;
    }

    protected virtual bool Authenticate(string username, string password)
    {
        throw new System.NotImplementedException();
    }

}
}

问题是,当我尝试将 NetworkClient 转换为 SkyfilterClient 时。引发异常,无法将“Network.NetworkClient”类型的对象强制转换为“Network.SkyfilterClient”类型。

我的代码有什么问题吗?我看到Stream可以转换为NetworkStream、MemoryStream。为什么NetworkClient无法转换为Skyfilter Client?


只要该对象实际上是一个SkyfilterClient,那么演员表应该可以工作。这是一个人为的例子来证明这一点:

using System;

class Program
{
    static void Main()
    {
        NetworkClient net = new SkyfilterClient();
        var sky = (SkyfilterClient)net;
    }
}

public class NetworkClient{}
public class SkyfilterClient : NetworkClient{}

然而,如果它实际上是一个NetworkClient,那么你就不能神奇地让它成为子类。这是一个例子:

using System;

class Program
{
    static void Main()
    {
        NetworkClient net = new NetworkClient();
        var sky = (SkyfilterClient)net;
    }
}

public class NetworkClient{}
public class SkyfilterClient : NetworkClient{}

但是,您可以创建一个转换器类。这里还有一个例子:

using System;

class Program
{
    static void Main()
    {
        NetworkClient net = new NetworkClient();
        var sky = SkyFilterClient.CopyToSkyfilterClient(net);
    }
}

public class NetworkClient
{  
  public int SomeVal {get;set;}
}

public class SkyfilterClient : NetworkClient
{
    public int NewSomeVal {get;set;}
    public static SkyfilterClient CopyToSkyfilterClient(NetworkClient networkClient)
    {
        return new SkyfilterClient{NewSomeVal = networkClient.SomeVal};
    }
}

但是,请记住,您无法以这种方式进行转换是有原因的。您可能缺少子类所需的关键信息。

最后,如果您只是想看看尝试的强制转换是否有效,那么您可以使用is:

if(client is SkyfilterClient)
    cast
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:将基类转换为子类 的相关文章

随机推荐

  • 如何在 grails TagLib 单元测试中模拟服务

    我有 TagLib Service 和 TestCase 如下 如何在标签库中模拟服务以从服务中获得预期结果 TagLib class SampleTagLib static namespace sample def baseService
  • 如何删除 QML 对象

    我正在尝试删除 QML 对象并重新创建对象 如下所示 Rectangle property var obj signal videoStopped variant complete function recreate url if obj
  • 当有多个快捷方式(NSUserActivity)时,siri 快捷按钮(INUIAddVoiceShortcutButton)显示错误的标题

    我的应用程序中有 2 个 Siri 快捷方式 我使用 NSUserActivity 来捐赠这些快捷方式 我还在我的 info plist 中创建了 2 个 NSUserActivityType 有 2 个视图控制器处理这些快捷方式 1 个视
  • IText 像 pdftotext -layout 一样读取 PDF?

    我正在寻找实现 java 解决方案的最简单方法 该解决方案与以下输出类似 pdftotext layout FILE 在 Linux 机器上 当然价格也应该便宜 我刚刚尝试了 IText PDFBox 和 PDFTextStream 的一些
  • 如何将图像或图标附加到谷歌折线图的边缘

    我想要折线图如下所示 或者只是图像序列图是可能的 like this 有什么可能的方法来实现这一目标吗 use the getChartLayoutInterface method https developers google com c
  • 将 Vcl::Controls::TCaption 又名 (System::UnicodeString) 转换为 const char *

    我目前正在使用 C Builder 创建一个将文本复制到用户剪贴板的应用程序 我已经放置了一个TMemo控制 我想将其包含在const char 变量如下面的代码所示 const char output TMemo1 gt Text 当我编
  • AWS创建POST策略base64编码+签名

    我正在尝试生成一个带有 PHP 签名的 AWS POST 策略 该策略将发送到客户端以允许通过 javascript AJAX 在浏览器中上传 我已将示例复制到http docs aws amazon com AmazonS3 latest
  • 我如何开始函数式编程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 随着函数式编程的大肆宣传 对于 C 程序员 函数式编程入门的最佳资源是什么 我并不是在寻找 C 3 0
  • UITableView:通过拖放将单元格移动到另一个位置

    我有一张包含 3 个部分的表格 第一部分 第二部分和第三部分 我想实现一种机制来通过拖放来更改单元格的位置 在同一部分内或从一个部分到另一个部分 示例1 在第一部分中 我有两行 sec1 row1 和 sec1 row2 在第二节中 我通过
  • 错误:toString 失败 Node.js 缓冲区

    有时我对 api 的 get 请求失败并显示此错误消息 顺便说一句 我使用请求模块来触发我的请求 Error toString failed buffer js 378 throw new Error toString failed Err
  • 使用 ES 模块运行 pm2

    我如何将pm2与基于ES模块 类型 模块 的包结合使用 我研究了类似的问题 没有任何有用的帮助 有人说它在 Windows 上不起作用 但我正在使用 Linux 我总是收到错误 Error ERR REQUIRE ESM require o
  • 在 python 中检索 .ttf 字体文件中所有字形的边界框和贝塞尔曲线数据

    我有兴趣提取给定 ttf 文件中所有字形的二次贝塞尔曲线信息 目前 使用 python 中的 ttfquery 库 我能够提取给定字形的轮廓 例如a 按以下方式 from ttfquery import describe from ttfq
  • 如何检查Android GPS是否被禁用[重复]

    这个问题在这里已经有答案了 我有两个文件 MainActivity java 和 HomeFragment java MainActivity 中调用 HomeFragment 中的一个函数 要求用户打开手机上的位置服务 问题是 即使用户已
  • 运行时 AOP 与编译时 AOP

    这两种AOP框架的优缺点是什么 我使用Unity作为我的aop框架 但我猜像postsharp这样的编译时aop框架可能比运行时aop框架有更好的性能 看起来运行时aop框架使用反射来实现注入 我不是 NET 人员 但我了解 Java 生态
  • Yarn add 引发错误 缺少要添加到项目中的包列表

    重新安装 Kubuntu 18 后 我尝试运行我的 vue cli 4 0 5 vuex 3 应用程序 并收到错误 错误缺少要添加到项目中的包列表 serge AtHome mnt work sdb8 wwwroot lar VApps v
  • 在 Xcode 7.2 中使用 PDF 作为图标图像

    我正在尝试在我正在开发的应用程序中使用 PDF 文件作为图标 我遇到的问题是色调颜色不一致 如果我从界面生成器设置按钮图像 则会显示图标图像black在运行时 每次 无论我尝试从界面生成器中设置什么 我尝试通过代码设置按钮图标图像而不是显示
  • Jenkins - 负载统计图奇怪的编码

    我在最新的 Jenkins 上有这个 但图例显示的是奇怪的字符而不是英语 有人知道这可能是什么吗 编码 即使使用其他显示图表的插件也是如此 我在 CentOS Linux 版本 7 4 1708 核心 Jenkins 2 73 1 apac
  • 在球拍中使用 stop-when

    我一直在搞这个程序 它需要一个数字并加 1 我想知道你到底如何使用stop when这里 例如 让它停在 5 点 我想这里需要一个 cond 声明 谢谢 require 2htdp image require 2htdp universe
  • Pandas:添加缺失月份的数据

    我有一个按月划分的客户销售信息数据框 看起来像这样 有多个客户和不同的月份和支出 customer id month year sales 0 12 2012 05 2 58 1 12 2011 07 33 14 2 12 2011 11
  • C#:将基类转换为子类

    我有一个类 NetworkClient 作为基类 using System IO using System Net Sockets using System Threading Tasks namespace Network using S