[英]C# polymorphism and templates
這個問題可能已經有人問過了,但我不知道要問正確的問題才能找到答案。
我正在嘗試創建一組包含值並允許其他組件訪問該值的類(標簽)。
該值是通用的,這將允許您創建任何類型的標簽。 但是,我需要能夠將標簽保存在列表或其他數據結構中,以允許組件具有多種類型的多個標簽。
public abstract class BaseTag
{
protected object _value;
public ushort DataQuality { get; protected set; }
public virtual object Value => _value;
public abstract void SetValue(object value, ushort dataQuality = 0);
}
public class Tag<T> : BaseTag
{
public new T Value
{
get => (T)_value;
private set
{
_value = value;
}
}
public override void SetValue(object value, ushort dataQuality = 0)
{
Monitor.Enter(_tagSync);
try
{
//If value or quality haven't changed, then do nothing
if (EqualityComparer<T>.Default.Equals((T)_value, (T)value) && dataQuality == DataQuality)
return;
DataQuality = dataQuality;
Value = (T)value;
}
finally
{
Monitor.Exit(_tagSync);
}
}
}
我什至不知道我是否還在問正確的問題。
誰能幫忙
我如何獲得擁有 List 標簽的能力; tags[0].Value <- 想要調用子值,但它不會,它返回 basetag._value,但類型為對象,而不是類型
有沒有更簡單更好的方法來實現這一目標?
你真的需要BaseTag
類嗎?
您可以將其轉換為接口並使用如下顯式接口聲明:
public interface IBaseTag
{
object Value { get; }
ushort DataQuality { get; }
}
public class Tag<T> : IBaseTag
{
public T Value { get; set; }
object IBaseTag.Value => Value; // explicit interface implementation
public ushort DataQuality { get; protected set; }
public virtual void SetValue(T value, ushort dataQuality = 0)
{
//If value or quality haven't changed, then do nothing
if (EqualityComparer<T>.Default.Equals(Value, value) && dataQuality == DataQuality)
return;
DataQuality = dataQuality;
Value = (T)value;
}
}
我跳過了_tagSync
功能。
然后你可以得到
var b = new Tag<int>(); //child
IBaseTag a = b; //parent
//a.Value and b.Value are both accessible and can be used
if (b.Value.Equals(a.Value) && a.DataQuality == b.DataQuality)
return;
您可以根據依賴隔離同時使用IBaseTag.Value
或Tag<>.Value
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.