gpt4 book ai didi

c# - 如何从 C# 中的抽象类实现 ObservableCollection

转载 作者:行者123 更新时间:2023-12-02 04:50:57 25 4
gpt4 key购买 nike

我有一个从接口(interface)实现属性的抽象基类:

public abstract class AbstractItem : IPropertyListOwner
{
public ObservableCollection<IProperty> Properties { get; }
}

我的具体类现在还需要实现具体属性:

public class ConcreteItem : AbstractItem
{
public ObservableCollection<ConcreteProperty> Properties { get; }
}

我该如何实现?现在我看到以下方法:

  1. Simply use a separate property, don't use that from base class
public class ConcreteItem : AbstractItem
{
public ObservableCollection<ConcreteProperty> ConcreteProperties { get; }
}
  1. Return a new filtered ObservableCollection
public class ConcreteItem : AbstractItem
{
public ObservableCollection<ConcreteProperty> ConcreteProperties
{
get { return new ObservableCollection<ConcreteProperty>(base.Properties.OfType<ConcreteProperty>()); }
}
}

你会怎么做?有更好的方法吗?

最佳答案

泛型将帮助您:

interface IPropertyListOwner<T>
where T : IProperty
{
ObservableCollection<T> Properties { get; }
}

abstract class AbstractItem<T> : IPropertyListOwner<T>
where T : IProperty
{
public abstract ObservableCollection<T> Properties { get; }
}

class ConcreteProperty : IProperty { }

class ConcreteItem : AbstractItem<ConcreteProperty>
{
public override ObservableCollection<ConcreteProperty> Properties
{
get
{
// ...
}
}
}

但是如果您打算在某个地方使用 IPropertyListOwner 工作,这会很不方便。 .

假设您有一些代码,应该只适用于 IProperty .例如,让此代码显示属性名称:

interface IProperty
{
string Name { get; }
}

在泛型的情况下,你不能写foreach , 这将在不知道 T 的情况下遍历属性集合在运行时:

void WritePropertyNames<T>(IPropertyListOwner<T> owner)
{
foreach (var property in owner.Properties)
{
Console.WriteLine(property.Name);
}
}

换句话说,用通用的 IPropertyListOwner<T> 做一些事情您还需要使用泛型的代码。

如果您要发布用例,将有助于发布更清晰的答案。

关于c# - 如何从 C# 中的抽象类实现 ObservableCollection<InterfaceType>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866633/

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