0

Address基本的なアドレス プロパティを定義し、CRUD オブジェクトとして機能する基本クラスがあります。

  • 名前
  • 会社
  • 住所1
  • 住所2
  • 住所 3 行目
  • 郵便番号

Address を拡張し、さらに 2 つのプロパティを含む「ShipToAddress」クラスがあります。

  • 電話番号
  • 電子メールアドレス

Addressには、各プロパティの検証メソッドが含まれており、ShipToAddressそのプロパティ (電話番号と電子メール アドレス) のみの検証が含まれています。

私の問題は、州と郵便番号に対して異なる検証方法を使用できるように、コードを複製することなく、これらの両方のクラスの米国と国際の両方の住所を考慮したいということです。USA State の検証により、値が 50 州のいずれかであることが保証されます。国際的な検証では、データベースで許可されている長さを超えないようにするだけです。

コードを複製せずに、さまざまな種類の住所 (米国、カナダなど) を許可するだけでなく、基本Addressクラスとクラスも持つように設計するにはどうすればよいでしょうか? ShipToAddress私は基本的に次のことを望んでいます:

  • Address基本クラス
  • ShipToAddress
  • USAAddress
  • USAShipToAddress
  • ***Address
  • ***ShipToAddress
4

2 に答える 2

5

AddressValidator を別のインターフェースとして定義します。

public interface AddressValidator {
    boolean validateAddress(ShipToAddress add);
}

それのさまざまな実装を作成します-USAAddressValidatorなどCanadaAddressValidator

国に基づいてFactory適切なオブジェクトを提供することができます。AddressValidator

public class AddressValidatorFactory {
    public static AddressValidator GetValidator(Address address) { ... }   
}

ShipToAddressまた、すべきextend Addressかどうかを検討する必要がありcontainます。期待されるShipToAddress場所にオブジェクトを渡すつもりですか? Addressそうでない場合は、ShipToAddressAddress を拡張する必要はありません。

于 2012-10-22T17:34:28.157 に答える
2

バリデーターをテンプレートパラメーターとして渡して、おそらくテンプレートにします。

class US_validator { /* ... */ };

class Int_validator { /* .. */ };

template <class Validator>
class Address { 
   // ...
};

template <class Validator>
class Shipping_address  : public Address {
    // ...
};

typedef Address<US_validator> US_Address;
typedef Address<Int_validator> Int_Address;
typedef Shipping_address<US_validator> US_Shipping_address;
typedef Shipping_address<Int_validator> Int_Shipping_address;

もう 1 つの可能性は、バリデーターを基本クラスとして多重継承を使用することです。

class US_validator { /* ... */ };
class Int_validator { /* ... */ };

class Address { /* ... */ };
class Shipping_Address : public Address { /* ... */ };

class US_Shipping_Address : public US_validator, public Shipping_Address { /* ... */ };
class Int_Shipping_Address : public Int_validator, public Shipping_Address { /* ... */ };

後者はほとんど使用されておらず、(おそらく) 好意的に見なされているわけでもありませんが、それでも完全に機能します。

于 2012-10-22T16:31:40.533 に答える