チャットアプリを作成しています。チャットでは、ユーザーは画像、ファイル、テキストメッセージの3種類のメッセージを送信できます。IMessege
3つのクラスプロパティを含むと呼ばれるインターフェイスを作成しようとしています。
interface IMessege
{
object content { get; }
User sender { get; }
DateTime sent { get; }
}
それから私は3つのクラスにインターフェースを実装する:FileMessege
、ImageMessege
とStringMessege
。私はそれらすべてを持っているしたいUser sender
とDateTime sent
、しかし、content
私はタイプからになりたいstring
でStringMessege
タイプから、file
時FileMessege
等...
これらのクラスはすべてから継承しているので、これが問題になるとは思いませんでしたobject
が、明らかに問題はあります。
どうすればいいですか?
(両方のオプションの名前を慣用的な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
利点:ジェネリックスの必要がない
欠点:インターフェイスを使用するときのコンテンツへの弱い型のアクセス、および少し複雑なコード。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加