2017-02-05 18 views
0

1つの変数タイプを除いて、同じクラスに2つのクラスがあります。
次の例は、この問題を示すはずです。プロパティの数が異なる複数のクラスを避ける

class Customer 
{ 
    byte Reputation; 
    const byte MaximumReputation = 255; 
    int Data; 
    string MoreData; 
    Briefcase EvenMoreData; 

    public Customer(byte reputation, int data, string moreData, Briefcase evenMoreData) 
    { 
     Reputation = reputation; 
     Data = data; 
     MoreData = moreData; 
     EvenMoreData = evenMoreData; 
    } 

    public float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 

    public string Information() 
    { 
     return Data.ToString() + ", " + MoreData + EvenMoreData.Id; 
    } 
} 
class CustomerDeluxe 
{ 
    ushort Reputation; 
    const byte MaximumReputation = 255; 
    int Data; 
    string MoreData; 
    Briefcase EvenMoreData; 

    public CustomerDeluxe(ushort reputation, int data, string moreData, Briefcase evenMoreData) 
    { 
     Reputation = reputation; 
     Data = data; 
     MoreData = moreData; 
     EvenMoreData = evenMoreData; 
    } 

    public float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 

    public string Information() 
    { 
     return Data.ToString() + ", " + MoreData + EvenMoreData.Id; 
    } 
} 

Customerの評判が255を超えることはありませんので、私はバイトに保存することができます。私のアプリケーションでは、このフィールドは大きな配列です。だから私は可能な限り小さなタイプを選びたいと思っています。しかし、フィールドが1バイトを超えることができるいくつかのケースでは、別のクラスが必要です。

これらの2つのクラスをどのように「マージ」できますか?

答えて

2

使用ジェネリック医薬品:ジェネリックで

public class BaseCustomer<TRep> 
{ 
    protected TRep Reputation; 
} 

public class CustomerDeluxe : BaseCustomer<ushort> 
{ 
} 

public class Customer : BaseCustomer<byte> 
{ 
} 

、あなたは基本的に言っている:「私はTREPの種類が何であるかわからないが、それは明らかにされます。」ジェネリックは、BaseCustomer<TRep>に上記のような場合が開かれてと言われています。私たちはそれを使用する前にを閉じてにする必要があります。我々がそれを継承すると、wev は、を特定のタイプで編集しました:あるケースでは、それはushortと指定され、別のものは、byteと指定されました。

そして、いくつかは、あなたがBaseCustomer<T>にコードのほとんどをプッシュすることができますリファクタリングを持つ:

public abstract class BaseCustomer<TRep> 
{ 
    protected TRep Reputation; 
    protected const byte MaximumReputation = 255; 
    int Data; 
    string MoreData; 
    Briefcase EvenMoreData; 

    public BaseCustomer(TRep reputation, int data, string moreData, Briefcase evenMoreData) 
    { 
     Reputation = reputation; 
     Data = data; 
     MoreData = moreData; 
     EvenMoreData = evenMoreData; 
    } 

    public abstract float Level(); 


    public string Information() 
    { 
     return Data.ToString() + ", " + MoreData + EvenMoreData.Id; 
    } 
} 

public class CustomerDeluxe : BaseCustomer<ushort> 
{ 
    public CustomerDeluxe(ushort reputation, int data, string moreData, Briefcase evenMoreData) 
     : base(reputation, data, moreData, evenMoreData) 
    { 
    } 

    public override float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 
} 

public class Customer : BaseCustomer<byte> 
{ 
    public Customer(byte reputation, int data, string moreData, Briefcase evenMoreData) 
     : base(reputation, data, moreData, evenMoreData) 
    { 
    } 

    public override float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 
} 
+0

は、私はジェネリックを認識していませんでした、あなたの迅速な答えをいただき、ありがとうございます。あなたは非常に親切で、バイト[]対ushort []などの一般的な配列の構文で答えを拡張できますか? – Leander

+0

リファクタリングを追加して、実際に単純化してクリーンアップしました。型を山括弧「」または「」 – CodingYoshi

+0

に渡してください。ありがとうございます。私は配列を理解した、私はちょうど精神的な経過を持っていた。 – Leander

1
class CustomerDeluxe : CustomerBase 
{ 
    ushort Reputation; 

    public override ushort GetReputation() 
    { 
     return Reputation; 
    } 
} 

class Customer : CustomerBase 
{ 
    byte Reputation; 
    public override ushort GetReputation() 
    { 
     return Reputation; 
    } 
} 

abstract class CustomerBase 
{ 
    const byte MaximumReputation = 255; 
    public abstract ushort GetReputation(); 

    public float Level() 
    { 
     return GetReputation()/MaximumReputation; 
    } 
} 
関連する問題