2016-09-17 2 views
0

次の例では、Filter2クラスのBaseFilter.Type値をオーバーライドできますか?ある意味では 2番目の子クラスの基底クラス値のオーバーライド

void Main() 
{ 
    BaseFilter abc = new Filter2(); 
    Console.WriteLine(abc.Type); 

    Filter1 d = new Filter2(); 
    Console.WriteLine(d.Type); 

    Filter2 e = new Filter2(); 
    Console.WriteLine(e.Type); 
} 

// Define other methods and classes here 

public class BaseFilter 
{ 
    public virtual string Type { get { return "ABC"; } } 
} 

public class Filter1 : BaseFilter 
{ 
    public new virtual string Type { get { return "DEF"; } } 
} 

public class Filter2 : Filter1 
{ 
    public override string Type { get { return "X"; } } 
} 

、上記の例から、私は「abc.Type」値「X」を返すことができるかどうかを確認したいと思います。しかし、私はFilter1クラスから "new"キーワードを削除したくありません。

だから、ここでBaseFilterクラスの値をオーバーライドするべきではありません、最終的な期待

  1. FILTER1クラスです。
  2. ただし、Filter2クラスはBaseFilterの値とFilter1の値をオーバーライドする必要があります。

OOPSでは可能ですか?

+1

'new'キーワードでシャドウイングされています。私はFILTER2にBaseFilter.Typeためのインターフェイスを使用してのアプローチを提案するが、それは良いデザインではなく、ただ「楽しい」のためであるが以下

ほとんど常に悪い考えです。 – Enigmativity

答えて

1

一般に、それは悪い考えです。私はゲッターの良いアイデアを持っていないJavaの観点から答えています。

しかし、ポイントは次のとおりです。優れたオブジェクト指向設計における多型を約行動、ない程度フィールドです!

意味:そのサブクラスが親のフィールドの内容を変更する必要はありません。 Open/Closed principleで説明されているように、物事は逆になることを望みます!

+0

Java、これはC#...ですか?私がまだ残っていると思うのは悪い考えだというあなたの主張。 – jdphenix

0

なぜこの動作が必要なのかはっきりしません。あなたは説明できますか?

私は確信していませんが、私はあなたの質問を読んでいるので、あなたはOOと多形性に関して良いことすべてを違反しようとしています:-)。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SO39543589 
{ 

    public interface ISecondTyper 
    { 
    string Type { get; } 
    } 

    // Define other methods and classes here 

    public class BaseFilter 
    { 
    public virtual string Type { get { return "ABC"; } } 
    } 

    public class Filter1 : BaseFilter 
    { 
    public new virtual string Type { get { return "DEF"; } } 
    } 

    public class Filter2 : Filter1, ISecondTyper 
    { 
    string ISecondTyper.Type 
    { 
     get 
     { 
     return (this as BaseFilter).Type; 
     } 
    } 
    public override string Type { get { return "X"; } } 
    } 

    class Program 
    { 
    static void Main() 
    { 
     BaseFilter abc = new Filter2(); 
     Console.WriteLine(abc.Type); 

     Filter1 d = new Filter2(); 
     Console.WriteLine(d.Type); 

     Filter2 e = new Filter2(); 
     Console.WriteLine(e.Type); 

     ISecondTyper st = e; 
     Console.WriteLine(st.Type); 

     Console.WriteLine("END"); 
     Console.ReadLine(); 
    } 
    } 
} 
関連する問題