簡體   English   中英

C# 多態性和模板

[英]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.ValueTag<>.Value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM