簡體   English   中英

C# - 將'object'參數轉換為該對象的類型?

[英]C# - Casting an 'object' parameter into that object's type?

C#

大家好,

我將一個對象傳遞給一個方法。

我想將該對象強制轉換為特定的類,以便我可以執行自己的特定方法嗎? 我怎樣才能做到這一點?

Move( new Cat() );
Move( new Pigeon() );

public void Move(object objectToMove)
{
    if(objectToMove== Cat)
    {
        Cat catObject = objectToMove as Cat;
        catObject.Walk();
    }
    else if(objectToMove== Pigeon)
    {
        Rat pigeonObject = objectToMove as Pigeon;
        pigeonObject.Fly();
    }
}

正確的方法是:

public interface ICanMove
{
   void Move();
}

由Cat和Pigeon實施:

public class Cat : ICanMove
{
   public void Move() { /* do something */ }
}

public class Pigeon : ICanMove
{
   public void Move() { /* do something */ }
}

然后像這樣調用它:

public void Move(ICanMove objectThatMoves)
{
   objectThatMoves.Move();
}

你獲得了幾件事:

  1. 您只能為實現該接口的對象調用Move(ICanMove objectThatMoves) 如果您嘗試傳遞其他對象,則程序將無法編譯。
  2. 你失去了條件陳述。 如果您決定將一個實現ICanMoveDog添加到您的程序中,Move方法將無需任何修改即可正常工作。 在您的版本中,您將不得不更改方法。

試想一下,如果你有多少你會工作必須is聲明在你的計划?

好吧,你可以像這樣使用is關鍵字:

if(objectToMove is Cat)
{
    ...
}
else if(objectToMove is Pigeon)
{
    ...
}

一個小點......不使用as和更合適更正確,因為隱含的第二類檢查是多余的。 要么按以下方式使用:

Cat catObject = objectToMove as Cat;
if(catObject!=null)
    catObject.Walk();
else 
{
    Pigeon pigeonObject = objectToMove as Pigeon;        
    if(pigeonObject!=null)
        pigeonObject.Fly();    
}

或者直接演員,因為你確信它會成功; 這更高效,更清晰: -

if(objectToMove is Cat)    
{        
     Cat catObject = (Cat)objectToMove;        
     catObject.Walk();    
}    
else if(objectToMove is Pigeon)    
{        
     Pigeon pigeonObject = (Pigeon)objectToMove;        
     pigeonObject.Fly();    
}

使用直接轉換,如果失敗則會得到異常,而不是null。 人們閱讀的代碼就知道沒有上下文“我們不只是想看看它是否可以治療as東西,我們確信,我們已經確定,它應該是可能的。

另一種解決方案而不是使用接口將是一個基類並覆蓋每個派生類中的Move()方法。

    abstract class Animal
    {
        public abstract void Move();
    }

    public class Cat : Animal
    {
        public override void Move()
        {
            //Cat specific behavior
        }
    }

    public class Bird : Animal
    {
        public override void Move()
        {
            //Bird specific behavior
        }
    }

我認為如果你擁有所有“動物”共有的屬性或方法,使用基類會更好。 這樣,您就不必在實現上述“IAnimal”接口的每個類中復制代碼。

當然如果沒有共同的元素接口工作正常。

您可以使用“is”運算符來檢查對象是否是某個類的實現。

if (objectToMove is Cat)

只是你的一點變化,這是好事。

Move( new Cat() );
Move( new Pigeon() );

public void Move(object objectToMove)
{
    if(objectToMove is Cat)
    {
        Cat catObject = objectToMove as Cat;
        catObject.Walk();
    }
    else if(objectToMove is Pigeon)
    {
        Rat pigeonObject = objectToMove as Pigeon;
        pigeonObject.Fly();
    }
}

我會做的是:

interface IAnimal
{
    void Move();
}

一個界面

那我的貓和我的小鳥:

class Cat : IAnimal
{
    public void Move()
    {
        //a cat moves by walking
        this.Walk();
    }

    public void Walk()
    {
        //do logic
    }
}

class Bird : IAnimal
{
    public void Move()
    {
        this.Fly();
    }

    public void Fly()
    {
        //do fly logic
    }
}

所以,當你完成后,你得到這個:

public void Move(IAnimal animal)
{
    animal.Move();
}

如果您想檢查動物的類型,您可以這樣做:

public void PrintType(IAnimal animal)
{   
    Console.WriteLine(typeof(animal));
    //or
    Console.WriteLine(animal.GetType());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM