1

我正在创建一个聊天应用程序。在聊天中,用户可以发送三种类型的消息:图像、文件和文本消息。我正在尝试创建一个名为的接口IMessege,其中包含 3 个类属性:

interface IMessege
    {
        object content { get; }
        User sender { get; }
        DateTime sent { get; }
    }

然后我想在 3 个类中实现接口FileMessegeImageMessegeStringMessege. 我希望他们都拥有User senderand DateTime sent,但content我想来自 type stringat StringMessege, from type fileatFileMessege等......

我不认为这会是一个问题,因为所有这些类都继承自object,但显然它是。

我该怎么做?

4

2 回答 2

4

(我已将两个选项中的名称更改为惯用的 C#。)

选项 1:使 IMessage 在内容类型上通用

interface IMessage<TContent>
{
    TContent Content { get; }
    User Sender { get; }
    DateTime Sent { get; }
}

public class FileMessage : IMessage<File>
{
   ...
}

public class StringMessage : IMessage<string>
{
   ...
}

// etc

优点:总是强类型
缺点:你现在不能拥有(比如说) a List<IMessage>。您可以通过分离非通用和通用部分来缓解这种情况:

interface IMessage
{
    User Sender { get; }
    DateTime Sent { get; }
}

interface IMessage<TContent> : IMessage
{
    TContent Content { get; }
}

选项 2:使用显式接口实现

interface IMessage
{
    object Content { get; }
    User Sender { get; }
    DateTime Sent { get; }
}

public class FileMessage : IMessage
{
    // Explicit interface implementation of the object-typed Content property 
    object IMessage.Content => Content;

    // Regular strongly-typed property for Content
    public File Content { get; }

    // Other interface properties
}

// etc

优点:不需要泛型
缺点:使用接口时对内容的弱类型访问,代码稍微复杂一些。

于 2020-01-03T16:56:14.213 回答
3

您可以使用通用接口。例如,

public interface IMessage<T>
{
    T content { get; }
    string sender { get; }
    DateTime sent { get; }
}

现在您可以将您的类定义为

public class StringMessage:IMessage<string>
{
    public string content { get; }
    public string sender { get; }
    public DateTime sent { get; }
}

public class FileMessage:IMessage<FileInfo>
{
    public FileInfo content { get; }
    public string sender { get; }
    public DateTime sent { get; }
}

public class ImageMessage:IMessage<Image>
{
    public Image content { get; }
    public string sender { get; }
    public DateTime sent { get; }
}

或者,您可以定义一个通用类 Message,但是,这将取决于该类的其他职责。如果类之间的唯一区别是内容的类型,您也可以使用以下内容(取决于您的用例)。下面的示例使用单个泛型类来实例化不同的实例(基于字符串、图像、文件)。

public class Message<T>:IMessage<T>
{
    public T content { get; }
    public string sender { get; }
    public DateTime sent { get; }
}

您现在可以将不同的实例初始化为

var fileMessage = new Message<FileInfo>();
var stringMessage = new Message<String>();
var imageMessage = new Message<Image>();
于 2020-01-03T16:48:19.677 回答