は、私はこのように呼ばれるメッセージ基底クラスを持っています。このような場合にはこの例でLSPを壊すのを避けるにはどうしたらいいですか? C#の
public class ClassicMessage : Message
{
private string m_title;
private string m_content;
public void SetTitle(string title) { m_title = title; }
public void SetContent(string content) { m_content = content; }
public string GetTitle() { return m_title; }
public string GetContent() { return m_content; }
}
public class MessageWithCustomContent : Message
{
private List<CustomContent> m_content;
public MessageWithCustomContent()
{
m_content = new List<CustomContent>();
}
public List<CustomContent> GetContent()
{
return m_content;
}
public CustomContent GetContentEntry(int id)
{
return m_content.find(x => x.ID.Equals(id));
}
}
public class CustomContent
{
private int m_id;
public int ID { get; set { m_id = value; } }
private string m_body;
public string Body { get { return m_body; } set { m_body = value; }
private Image m_image;
public Image Image { get { return m_image; } set { m_image = value; } }
}
:
public abstract class Message
{
protected int m_id;
protected bool m_localized;
protected string m_metaData;
public int GetID() { return m_id; }
public bool GetLocalized() { return m_localized; }
public string GetMetadata() { return m_metaData; }
}
その後、私は、例えばメッセージから継承し、さらに2つのクラスを持っています派生クラスに似たメソッドがあるが、これらのメソッドの戻り値の型が異なる場合は、どうすればアプリケーションインターフェイスを統一できますか? (たとえメソッドが同じことをしようとしても)
私は、Liskov Substitution PrincipleとOpen/Closedの原理を破っていることを知っていますが、それを回避するにはどうすればよいでしょうか?
ありがとうございました!
編集:私はtypeofを使用しないようにしたいので、より明確にするために
、私は何を達成しようとしていることは、ベースの「メッセージ」として、可能なすべてのメッセージを管理する共通のインタフェースを作成することです消費者階級。例えば
:
if(message is MessageWithCustomContent)
{
// do something with the contents.
}
else if(message is MessageWithCustomContent)
{
// do another thing with the contents.
}
etc...
宣言でジェネリックタイプを指定する必要があるため、メッセージを管理するための単一のリストを作成できません – cmszc
私の答えは上記の – Coolio
を編集しました。私は自分で非常に似た実装になった。しかし、この問題のために私が使っているアプローチは間違って設計されているようです。リストや文字列かどうかをチェックせずにコンテンツを処理する方法がないからです。とにかくあなたの答えを正しいものとしてマークします。ご助力ありがとうございます! – cmszc