如何创建一个接口基础属性,然后用派生的实现?
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中实现接口:FileMessege
、ImageMessege
和StringMessege
。我希望它们都有 User sender
和 DateTime sent
,但是 content
我想来自类型 string
at StringMessege
,来自类型 file
在 FileMessege
等等...
我认为这不会成为问题,因为所有这些 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
优点:不需要泛型
缺点:使用界面访问内容弱类型,代码略复杂
我正在创建一个聊天应用程序。在聊天中,用户可以发送三种类型的消息:图片、文件和文本消息。我正在尝试创建一个名为 IMessege
的接口,其中包含 3 个 class 属性:
interface IMessege
{
object content { get; }
User sender { get; }
DateTime sent { get; }
}
然后我想在3 class中实现接口:FileMessege
、ImageMessege
和StringMessege
。我希望它们都有 User sender
和 DateTime sent
,但是 content
我想来自类型 string
at StringMessege
,来自类型 file
在 FileMessege
等等...
我认为这不会成为问题,因为所有这些 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
优点:不需要泛型
缺点:使用界面访问内容弱类型,代码略复杂