如何创建一个接口基础属性,然后用派生的实现?

How to make a interface base property, then implement with the derived?

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

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

然后我想在3 class中实现接口:FileMessegeImageMessegeStringMessege。我希望它们都有 User senderDateTime sent,但是 content 我想来自类型 string at StringMessege,来自类型 fileFileMessege 等等...

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

我该怎么做?

您可以使用通用的 Interface.For 示例,

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

现在您可以将 classes 定义为

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; }
}

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

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>();

(我已将两个选项中的名称更改为惯用的 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

优点:总是强类型
缺点:你现在不能有(比方说)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

优点:不需要泛型
缺点:使用界面访问内容弱类型,代码略复杂