gpt4 book ai didi

c# - 在此示例中如何避免破坏 LSP? C#

转载 作者:太空宇宙 更新时间:2023-11-03 21:04:40 27 4
gpt4 key购买 nike

我有一个名为 Message 的基类,如下所示:

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

然后,我还有两个继承自 Message 的类,例如:

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

在这种情况下,如果派生类具有相似的方法但这些方法具有不同的返回类型,我该如何统一应用程序接口(interface)? (即使方法试图做同样的事情)

我知道这个例子违反了里氏替换原则和开/闭原则,解决这个问题的最佳方法是什么?

感谢您的帮助!

编辑:

为了更清楚,我试图实现的是创建一个通用接口(interface)来管理所有可能的消息作为基本“消息”,因为我想避免在消费者类中使用 typeof。

例如:

if(message is MessageWithCustomContent) 
{
// do something with the contents.
}
else if(message is MessageWithCustomContent)
{
// do another thing with the contents.
}
etc...

最佳答案

您可以将 Message 更改为通用的,而 T 将指定 Content 返回类型。请参见下面的示例。

编辑您可以使用“IMessage”和“消息:IMessage”作为基础。然后您就可以像这样创建一个 IMessage 列表

var messages = new List<IMessage>
{
new ClassicMessage(),
new MessageWithCustomContent()
};
foreach (var message in messages)
{
message.GetContent();
}

下面是如何实现 IMessage 的。

public interface IMessage
{
int GetID();
bool GetLocalized();
string GetMetadata();
object GetContent();
}

public abstract class Message<T> : IMessage
{
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; }
object IMessage.GetContent()
{
return GetContent();
}
public abstract T GetContent();
}

public class ClassicMessage : Message<string>
{
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 override string GetContent()
{
return m_content;
}
}

public class MessageWithCustomContent : Message<List<CustomContent>>
{
private List<CustomContent> m_content;

public MessageWithCustomContent()
{
m_content = new List<CustomContent>();
}

public CustomContent GetCustomContent(int id)
{
return null;
}

public override List<CustomContent> GetContent()
{
return m_content;
}
}

public class CustomContent
{
private int m_id;
public int ID { get; set; }
private string m_body;

public string Body
{
get { return m_body; }
set { m_body = value; }
}
}

关于c# - 在此示例中如何避免破坏 LSP? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42055619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com