1

議論の余地のあるトピックになる可能性がありますが...次のことができないのは本当に嫌いです:

class User 
{
   public string ImageURL {get;set;}
}

class UserUI : User 
{
   public Brush ImageBrush {get;set;}
}

User user = GetFromUserFromServer(); //returns User type object, not UserUI
UserUI userUI = user;
userUI.ImageBrush = CreateBrush(userUI.ImageURL);

代わりに、次のようなものを使用します。

class User 
{
   public virtual string ImageURL {get;set;}
}

class UserUI : User 
{
   public override string ImageURL 
    {
        get
        {
            return base.ImageURL ;
        }
        set
        {
            if (value != base.ImageURL )
            {                    
                base.ImageURL = value;
                ImageBrush = CreateBrush(value);
            }
        }
    }

   public Brush ImageBrush {get;set;}

   public UserUI(User user)
   {
       ImageURL = user.ImageURL;
   }
}

User user = GetFromServer();
UserUI userUI = new UserUI(user);

これははるかに冗長であり、フィールドを User に追加するときはいつでも、それらを UserUI コンストラクターにコピーする必要があります。

ダウンキャストを許可すると、これらすべてがはるかに簡単になり、エラーが発生しにくくなると言っても過言ではありませんか?

4

4 に答える 4

5

えーと…いや これを行うとどうなると思いますか。結局のところ、これは例と同じように有効です。

string whatever = "";
UserUI userUI = whatever;
userUI.ImageBrush = CreateBrush(userUI.ImageURL);

結局のところ、どちらもオブジェクトから継承します。そのプロパティが存在しないため、userUI.ImageURLは例外をスローしますか?または何?これは狂気です。:)

編集:あなたは上のコメントで言います:

「ええ。私の主張は、派生型にキャストする方法があるはずであり、フレームワークは両方の型に存在するフィールドを自動的にコピーし、他は空のままにするということです。この場合、ImageURLがコピーされます。

それが必要な場合は、Automapperを使用してください:https ://github.com/AutoMapper/AutoMapper/wiki

于 2012-08-09T17:54:06.827 に答える
4

Liskov の置換原則をよく読んでみると、ダウン キャスティングが必要な場合、設計に欠陥があることがわかります。

于 2012-08-09T17:55:37.053 に答える
3

これは、「継承よりも構成を優先する」というフレーズを参照するのに適したケースです。UserUI は User から継承するのではなく、ユーザーを含めます。

public class UserUI
{
  public User MyUser {get; set;} //or have it set in just a constructor, if that makes more sense
  public Brush ImageBrush {get;set;}
}

次に、 を に設定するのではなくUser、既存のを にUserUI追加するだけです。UserUserUI

User someUser = ...;
UserUI = someUserUI = new SomeUserUI();
someUserUI.MyUser = someUser;
于 2012-08-09T18:08:26.157 に答える
0

GetFromServer() から返されたオブジェクトが実際に UserUI オブジェクトである場合、問題なくダウンキャストできます。

User user = GetFromServer();
UserUI userUI = (UserUI) user; // or: UserUI userUI = user as UserUI;

user参照が実際には UserUI オブジェクトでない場合、ダウンキャストするものはありません (そのため、キャストは例外をスローします)。それがあなたの状況である場合UserUI、元のオブジェクトに基づいて新しいオブジェクトを作成する必要がありUserます。これはあなたがしていることであり、ダウンキャストとはまったく異なります。

于 2012-08-09T18:02:08.197 に答える