【问题标题】:C# abstract class and covariant [closed]C#抽象类和协变[关闭]
【发布时间】:2012-10-08 12:33:51
【问题描述】:

我有一些这样的代码:

class DataFilter
{
    List<Animal> animals=null;
    public function1(string TypeOfData)
    {
        if(TypeOfData=="cat"){//get cats from database and do something}
        else if(TypeOfData=="dog")
        {//get dogs & do something}
    }
}
class Animal
{}
class Cat:Animal
{}
class Dog:Animal
{}

如果我重用 DataFilter 类:

 class CatFilter:DataFilter
 {
 }

如何重用列表动物属性???

如何重构它以将function1分成不同的类

【问题讨论】:

    标签: c# refactoring ooad


    【解决方案1】:
     List<Animal> animals = new List<Animal>() { new Dog(), new Cat() };
     foreach (var animal in animals)
          animal.DoSomething();
    

    --

    class Animal
    { public virtual void DoSomething() { } }
    
    class Cat : Animal
    { public override void DoSomething() { Console.WriteLine("CAT"); } }
    
    class Dog : Animal
    { public override void DoSomething() { Console.WriteLine("DOG"); } }
    

    --编辑--

    我还是不明白你真正想要什么。但是看到关键字filter 让我想到

    var groupedAnimals = animals.GroupBy(a => a.GetType())
                             .Select(g => new { Type = g.Key, Animals = g.ToList() })
                             .ToList();
    

    var cats = animals.OfType<Cat>().ToList();
    

    【讨论】:

    • 对不起,我不是这个意思
    • @Kevin 但是您的意思并不清楚。你想重新表述你的问题吗?
    【解决方案2】:

    您可以在设计中使用多态性的概念,例如:

    class DataFilter
    {
        List<Animal> animals = new List<Animal>() { new Dog(), new Cat() };
    
        public function1()
        {
            foreach (var animal in animals)
                animal.Do();
        }
    }
    
    abstract class Animal
    {
        public abstract void Do();
    }
    
    class Cat: Animal
    {
        public override void Do() {}  
    }
    
    class Dog: Animal
    {
        public override void Do() {}
    }
    

    【讨论】:

    • @Kevin:你什么意思?您能否更新您的问题,似乎不太清楚
    • 我认为DataFilter可以是一个基类
    • @Kevin: 你能更新你的问题更清楚吗,我还是不明白你的意思
    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多