2017-07-06 61 views
0

我想執行,在子類的函數是類從抽象父類型。例如:聲明的子類型變量的抽象類

abstract class Animal { 
    public abstract void Add(Animal animal); 
} 

class Cat: Animal { 
    public override void Add(Cat cat) { 
     //Do cat things 
    } 
} 

class Dog: Animal { 
    //This should not be allowed 
    public override void Add(Animal dog) { 
     //Do dog things 
    } 
} 

這裏我們可以看到一個Cat類型的對象可以傳遞給Dog.Add。有沒有辦法強制執行功能採取類型Dog

我相信有辦法讓它在運行時進行檢查,但如果可能的話我寧願有一個編譯器錯誤。

+2

這是不可能的,因爲如果你這樣做,那麼子類不會實現動物類的Add方法。當你在基類中聲明抽象方法時,這個方法必須在子類中實現。你能指定你的要求是什麼以及你爲什麼要這樣做? –

+0

嗯,這是一個很好的觀點。我爲用戶提供了一個抽象的「效果」類,這些類將有一些方法用於採用同一類的其他實例。雖然,由於用戶正在定義方法,我想可能會出現用戶可能希望不同類型的「效果」通過的用例。 –

回答

1

你可能會宣佈一個接口,並使用了其中約束泛型。

public abstract class Animal 
{ 
} 

public interface IAnimalCollection<T> where T : Animal 
{ 
    void Add<T>(T animal); 
} 

public class Cat : Animal, IAnimalCollection<Cat> 
{ 
    public void Add(Cat animal) 
    { 
    } 
} 

public class Dog : Animal, IAnimalCollection<Dog> 
{ 
    // won't compile 
    public void Add(Animal animal) 
    { 
    } 
} 

public class Ferret : IAnimalCollection<Ferret> 
{ 
    public void Add(Ferret animal) 
    { 
    } 

    public void Add(Animal animal) 
    { 
    } 
} 

// won't compile 
public class Foo : IAnimalCollection<Foo> 
{ 
    public void Add(Foo animal) 
    { 
    } 
} 
+0

問題是'公共類Cat:Animal,IAnimalCollection '仍然有效。 –

+0

也許我想實施一隻抓狗的貓! – Jasen

+0

如果每個Effect子類都有不同的行爲,那麼應該將這些行爲封裝到接口中而不是基類中。 – Jasen