2012-10-18 55 views
-4

我有一些像這樣的代碼:C#抽象類和協

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 
{ 
} 

如何重用名單動物屬性???

如何重構它的功能1分成不同的類

+0

哪裏是'TypeOfData'而來? –

回答

1

您可以使用概念多態性到您的設計,例如:

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() {} 
} 
+0

抱歉,不是我的意思 –

+0

@Kevin:你什麼意思?您可以更新您的問題,似乎並不清楚多少 –

+0

我覺得DataFilter可以是一個基類 –

2
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"); } } 

- EDIT--

我還是不明白你真正想要什麼。但看到關鍵字filter讓我覺得

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

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

抱歉,但是這不是我的意思 –

+0

@凱文但是你試圖表達的意思並不清楚。你會想要重述一下你的問題嗎? –