59

何が良く見えるか、抽象クラスとプロパティで実際にいつ使用するか、または非抽象プロパティをいつ使用するかはよくわかりません。簡単な例を作ってみます。私がこれを持っているとしましょう:

abstract class Human
{
  public GenderType Gender { get; set; }
  public string Name { get; set; }
  public Date Born { get; set; }
  public bool IsNerd { get; set; }

  abstract public void Speak();
  abstract public void Sleep();
  abstract public void AnoyingPeopleOnStackOverflow();
  //... so on
}

class Peter : Human
{
  //Peter is special, he got a second name
  //But thats all, everything else is the same as like on other humans
  public string SecondName { get; set; }

  //...override abstract stuff
}

これでいいですか?私が理解したように、オーバーライドしたくない場合は抽象プロパティを使用する必要はありません。Speakこの状況では、などのメソッドだけSleepを抽象化する必要があります。

さて、これでよければ、いつ抽象プロパティを使用するか、または使用する必要がありますか?

4

5 に答える 5

96

デフォルトの実装がなく、派生クラスがそれを実装する必要がある場合は、抽象プロパティを使用します。

基本クラスに実装があるが、オーバーライドを許可したい場合は、仮想プロパティを使用します。

overrideキーワードを使用して、メンバーをオーバーライドします。sealed overrideメンバーを再度オーバーライドしないようにマークします。

プロパティにマークを付けabstractたりvirtual、オーバーライドしたくない場合はマークを付けないでください。

キーワードを使用しnewて、非抽象的で非仮想的なメンバーを非表示にします(これはめったに良い考えではありません)。

方法:抽象プロパティを定義する

抽象プロパティは、タイプ固有のロジックや副作用があることを意味するデザインで頻繁に発生することがわかりました。基本的に、「すべてのサブクラスに必要なデータポイントがありますが、実装方法がわかりません」と言っています。ただし、大量のロジックを含むプロパティや副作用を引き起こすプロパティは望ましくない場合があります。これは重要な考慮事項ですが、それを行うための固定された正しい/間違った方法はありません。

見る:

個人的には、抽象メソッドを頻繁に使用しますが、プロパティを抽象化することはめったにありません。

于 2012-09-03T21:58:07.837 に答える
43

私は彼らに何をしてほしいかを知っています、私は彼らがそれをどのように行うかは気にしません:インターフェース。

私は彼らに何をしてもらいたいかを知っています。彼らがそれをどのように行うかは気にしませんが、彼ら(または少なくとも彼らのほとんど)が他のビットをどのように行うかについてはしっかりとした考えを持っています:抽象クラス。

私は彼らに何をしてもらいたいのか、そして彼らのほとんどがそれをどのように行うのかを知っています:仮想メンバーによる具体的なクラス。

たとえば、抽象メンバーのない抽象クラス(インスタンスを作成することはできませんが、それが提供する機能は完全に提供されます)などの他のケースもありますが、特定の階層があるため、通常は発生しません。与えられた問題に対して、それ自体をクリーンかつ露骨に提供します。

(ちなみに、私はピーターを一種の人間とは考えていませんが、各ピーターをたまたまピーターと呼ばれる人間のインスタンスと考えています。この方法でサンプルコードを選択するのは実際には公平ではありませんが、この種の問題について考え直すと、通常よりも適切になります)。

于 2012-09-03T22:10:24.680 に答える
17

抽象メンバーは、オーバーライドする必要がある単なる仮想メンバーです。これは、実装する必要があるが、基本クラスでは実装できないものに使用します。

仮想プロパティを作成し、クラスを継承するクラスでそれをオーバーライドする必要がある場合は、それを抽象プロパティにします。

たとえば、動物のクラスがある場合、その呼吸能力は、それが動物であるという情報だけから判断することはできませんが、それは非常に重要なことです。

public abstract class Animal {

  public abstract bool CanBreathe { get; }

}

魚と犬の場合、実装は異なります。

public class Dog : Animal {

   public override bool CanBreathe { get { return !IsUnderWater; } }

}

public class Fish : Animal {

   public override bool CanBreathe { get { return IsUnderWater; } }

}
于 2012-09-03T22:00:02.890 に答える
7

すべてのサブクラスがメソッド/プロパティを実装する必要がある場合は、abstractを使用します。すべてのサブクラスがそれを実装する必要がない場合は、それを使用しないでください。

あなたの例のように、SecondName各人に必須でない場合は、基本クラスで抽象プロパティを作成する必要はありません。一方、すべての人が2番目の名前を必要とする場合は、それを抽象的なプロパティにします。

抽象プロパティの正しい使用例:

public class Car
{
    public abstract string Manufacturer { get; }
}

public class Odyssey : Car
{
    public override string Manufacturer
    {
         get 
         {
             return "Honda";
         }
    }
}

public class Camry : Car
{
    public override string Manufacturer
    {
         get 
         {
             return "Toyota";
         }
    }
}

すべての車にはメーカーがあり、そのメーカーが誰であるかをユーザーに伝える必要があるMakerため、要約を作成することは正しいです。

于 2012-09-03T21:58:10.363 に答える
2

抽象プロパティは、クラスに常にプロパティを公開させたいが、そのプロパティの実装を特定できない場合に使用されます。つまり、継承するクラスに任せたり、強制的に公開したりします。

ここに例があります。ここでは、抽象クラスの名前がで、抽象プロパティShapeを公開しています。形状のタイプごとに面積の式が変わるため、基本クラスにプロパティをArea実装することはできません。Areaすべての図形には(ある種の)領域があるため、すべての図形でプロパティを公開する必要があります。

実装自体は問題ないように見えます。の抽象プロパティの賢明な例を考えようとしていましたがHuman、合理的なものは何も考えられませんでした。

于 2012-09-03T21:58:31.367 に答える