2017-10-07 17 views
0

私はBaseClassを拡張するクラスDerivedClassを持っています。 BaseClassの2人の代表者との文字列ように見えます取るコンストラクタがあります。DerivedClassで派生クラスのコンストラクタで基本クラスのコンストラクタに渡す代理人を作成する

public BaseClass(Func<string, bool> stringToBool, Func<string, string> stringToString) 
{ 
    ... 
} 

を、私はシンプルで、「デフォルト」で働く代表者に渡して、基本コンストラクタを呼び出しデフォルトコンストラクタを持つようにしたいです方法、例えばstringToBoolは常にfalseを返します。またはstringToStringは、渡された文字列を常に返します。どうすればこれを達成できますか?

public class BaseClass { 
    public BaseClass(
     Func<string, bool> stringToBool = null, 
     Func<string, string> stringToString = null 
    ){ 
     stringToBool = stringToBool ?? DefaultStringToBool; 
     stringToString = stringToString ?? DefaultStringToString; 
    } 

    private static bool DefaultStringToBool(string s) { 
     <Insert default logic here>; 
    } 

    private static string DefaultStringToString(string s) { 
     <Insert default logic here>; 
    } 
} 

その後、あなたもしない限り、すべてのコンストラクタベースのものに触れる必要はありません。私は、これはあなたが実際にそれから欲しいものであると考えているフレーズ「デフォルトの方法」のご利用に基づき

+0

あなたはちょうど言った。あなたは構文を求めていますか? – Blorgbeard

+0

私が欲しいものを行うDerivedClassのメソッドを作成し、そのコンストラクタのメソッドを渡す必要がありますか?または、コンストラクタ自体に関数を作成する方法はありますか? –

+0

確かに、 'base(t => false、t => t)'のような単純なものはうまくいくと思います。 – Blorgbeard

答えて

0
class BaseClass 
{ 
    public BaseClass(Func<string, bool> stringToBool, Func<string, string> stringToStirng) 
    { 

    } 
} 


class DerivedClass : BaseClass 
{ 
    public DerivedClass() : base(s => true, s => s) 
    { 

    } 
} 
0

そのデフォルトロジックをオーバーライドする必要があります。

しかし、あなたは本当にこれをやってはいけません。あなたのクラスを強く結び付けます。より良い

はこれを行うには:

public abstract class BaseClass { 

    protected virtual bool DefaultStringToBool(string s) { 
     <Insert default logic here>; 
    } 

    protected virtual string DefaultStringToString(string s) { 
     <Insert default logic here>; 
    } 
} 

public DerivedClass : BaseClass { 
    protected override string DefaultStringToString(string s) { 
     <Insert override logic here>; 
    } 
} 

は、あなたのシステムの設計上の欠陥がありますあなたは、インスタンスメソッドにのfuncsを渡している場合は、クラスがすでになどオーバーライドメソッド、抽象メソッド、仮想メソッドを持つことができるので、