2009-07-24 20 views
1

私のプロジェクトでは、派生クラスにいくつかの機能がありますが、それぞれ異なるセクションを除いて同じです。派生クラスのメソッドを共通基底クラスにリファクタリングする方法? (C#)

メソッドを基本クラスまでプルしたいと思います。

関数は次のようになり:異なる機能の中心線すべてが上記のように見えるが、「SOMEVAR」に異なる値とで異なる変数有する

func(parameters) 
{ 
//COMMON BITS 

if  (someVar == "value1") { htmlFilename = line; } 
else if (someVar == "value2") { subVideoLink = line; } 
else if (someVar == "value3") { linksH2HeadingWritten = true; } 

//COMMON BITS 
} 

「変数=行;」フォーマット。

これは一般的な形式です:

if (someVar == "CommandName") { variable = line; } 

私が持っていたアイデアは、しかし、私がそれで参照文字列で辞書を作ることができないようです...機能Dictionary<string CommandName, ref string>を送信することでした...

「変数」のブール値の場合は、文字列バージョンで「真」または「偽」の値に置き換えて削除します。

これを行うより良い方法はありますか?

答えて

4

より良い方法は、funcで呼び出す基本クラスでvirtual(またはabstract)メソッドを定義することです。その後、各サブクラスで特定の命令でメソッドをオーバーライドすることができ、funcはサブクラスの動作を使用します。あなたが取る機能を持っているときに非常に便利

if (activeCommand is CommandType) { /*logic, cast if necessary*/ } 

:私はあなたが正しく何をしようとして理解していた場合

public class MyBase 
{ 
    protected virtual void DoCommand() { throw new NotImplementedException(); } 

    public void Func() 
    { 
     ... 
     DoCommand(); 
     ... 
    } 
} 

public class MySubClass : MyBase 
{ 
    protected override void DoCommand() 
    { 
     ... 
    } 
} 
+0

ああ...あなたの言っていることが分かります。ありがとう、私はそれを試みます。 –

+0

ベースに投げ込む代わりに、それを抽象的にマークするのはなぜですか? –

+0

抽象メソッドは、抽象基本クラスを必要とします。何らかの理由で基本クラスを具体化する必要がある場合、これがデフォルトの実装の1つです。空が別の選択肢になります。好きなのを選びな。 :) – dahlbyk

0

あなたは、基本クラスのオーバーライド可能なメソッドを作成する必要があります

abstract func(parameters); 

を、派生クラスでそれを実装:

class CommandN { 
... 
func(parameters) 
{ htmlfilename = line; } 
} 

class CommandSubVideoLinkX { 
... 
func(parameters) 
{ subVideoLink = line; } 
} 

のように。

+0

Commandクラスは、これらの関数の派生クラスではありません。申し訳ありませんが、私はそれを明確にしませんでした。 –

0

、あなたはに

if (activeCommand.GetType().Name == "CommandName") { variable = line; } 

ダウンを減らすことができます基底クラスですが、派生型に対して特殊なケースを実行します。これは、別の型がCommandTypeから派生するケースも処理します。

+0

ええ、ありがとう、私は瞬間的な脳のおならを持っていた –

関連する問題