2016-09-17 62 views
0

是否可以在以下示例中覆蓋Filter2類中的BaseFilter.Type值?覆蓋第二個子類中的基類值

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類中刪除「新」關鍵字。

所以,這裏是最後的期望值

  1. 過濾器1類不應該覆蓋從BaseFilter類值。
  2. 但是,Filter2類應該覆蓋BaseFilter和Filter1中的值。

OOPS語言可以嗎?

+1

用'new'關鍵字遮蔽,幾乎總是一個壞主意。 – Enigmativity

回答

1

一般來說,這是一個壞主意。我從java的角度回答,我們沒有那種getter的好主意。

但重點是:良好的OO設計中的多態性約爲行爲,而不是約字段

含義:您不希望該子類必須更改父項字段的內容才能做到這一點。你想要的事情是相反的,如Open/Closed principle所述!

+0

Java,這是C#...?你認爲這是一個糟糕的主意,我認爲仍然存在。 – jdphenix

0

目前尚不清楚爲什麼你需要這種行爲。你能解釋一下嗎?

我不確定,但是當我讀到你的問題時,你將違反所有關於OO和多態的好處:-)。

下面,但是我建議使用的過濾器2的BaseFilter.Type接口的方法,但它不是一個良好的設計和只是爲了「好玩」:

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(); 
    } 
    } 
}