尝试使用泛型来计算.NET等价物(已经使用Java几年了)。这里有一些我想要的伪代码:
abstract base class MyBase
abstract property string Name;
abstract property ObservableCollection<T> SubItems;
然后我有2个继承自myBase的类,每个类都会实现2个属性,集合中的对象类型也会不同。
class Real1 : MyBase
property string Name
property ObservableCollection<SomeClass> SubItems;
class Real2 : MyBase
property string Name
property ObservableCollection<SomeDifferentClass> SubItems;
重点是允许将这些项绑定到TreeView,该TreeView要求所有子元素具有相同的属性名称(对于xaml绑定)。如果我必须创建一个具有通用类型的新集合,我将不得不遍历每个集合并且它们很大。我不控制原始的集合数据,因此我无法修改这些类。
答案 0 :(得分:3)
听起来你想要一个通用的基类:
abstract class MyBase<T>
{
public abstract string Name {get; set;}
public abstract ObservableCollection<T> SubItems {get; set;}
}
class Real1 : MyBase<SomeClass>
{
public override string Name {get; set;}
public override ObservableCollection<SomeClass> SubItems {get; set;}
}
class Real2 : MyBase<SomeDifferentClass>
{
public override string Name {get; set;}
public override ObservableCollection<SomeDifferentClass> SubItems {get; set;}
}
但除非属性的实现不同,否则我不明白为什么你需要一个抽象基类,并且不清楚为什么你需要子类。您可以创建MyBase<SomeClass>
,而无需定义子类型。
答案 1 :(得分:0)
我同意斯坦利的观点。仅仅因为你可以创建一个抽象类并不意味着你应该这样做。这是您需要抽象类的场景:
假设您正在静态类中创建一个方法来处理动物声音并执行某些操作,例如
public static class AnimalHelper {
public static string NotifySound(this Animal animal) {
return animal. GetType().Name + " " + animal.Sound.ToString() + "s";
}
}
现在,你不知道你的动物及它的SoundType。所以你创建了一个抽象类:
public abstract class Animal {
public abstract SoundType Sound{get;}
}
public enum SoundType{
Bark,
Roar,
Meow
}
public class Dog:Animal {
public override SoundType Sound { get { return SoundType.Bark; } }
}
public class Lion:Animal {
public override SoundType Sound { get { return SoundType.Roar; } }
}
所以在这里你已经创建了使用OOP处理声音的通用方法。我希望这给你正确的视角来使用抽象。