У меня есть базовый класс под названием сообщение так:Как я могу избежать нарушения LSP в этом примере? C#
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; }
}
Тогда, у меня есть еще два класса, которые наследуют от Сообщения, например:
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; } }
}
В таком случае, как это , как я могу унифицировать интерфейс приложения, если производные классы имеют похожие методы, но эти методы имеют разные типы возвращаемых данных? (даже если методы пытаются сделать то же самое)
Я знаю, что с примером я нарушаю принцип замещения Лискова и принцип Open/Closed, какой лучший подход для этого?
Благодарим за помощь!
Edit:
Для большей ясности, что я пытаюсь добиться того, чтобы создать общий интерфейс для управления всех возможных сообщений в качестве базового «Message», потому что я хочу, чтобы избежать использования TypeOf в потребительский класс.
, например:
if(message is MessageWithCustomContent)
{
// do something with the contents.
}
else if(message is MessageWithCustomContent)
{
// do another thing with the contents.
}
etc...
Это хорошая идея, но я не могу создать единый список сообщений для их управления, потому что я должен указать общий тип в объявлении – cmszc
Я отредактировал свой ответ выше – Coolio
Nice! Я сам пришел к очень похожей реализации. Но похоже, что подход, который я использую для этой проблемы, неправильно разработан, потому что тогда невозможно обработать контент, не проверяя, является ли это списком или строкой. Я всегда буду отмечать ваш ответ. Большое спасибо за Вашу помощь! – cmszc