覆盖第二个子类的基类值

时间:2016-09-17 06:32:04

标签: c# oop

是否可以在以下示例中覆盖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"。但是,我不想删除" new" Filter1类中的关键字。

所以,这是最终期望

  1. Filter1类不应覆盖BaseFilter类的值。
  2. 但是,Filter2类应该覆盖BaseFilter和Filter1的值。
  3. 是否可以使用OOPS语言?

2 个答案:

答案 0 :(得分:1)

总的来说,这是一个坏主意。我正在回答java的观点,我们对getter没有那么好的想法。

但问题是:良好的OO设计中的多态性是关于行为,而不是关于字段

含义:您不希望子类必须更改字段的内容才能执行此操作。如Open/Closed principle所述,你希望事情成为另一种方式!

答案 1 :(得分:0)

目前尚不清楚为什么要这种行为。你能解释一下吗?

我不确定,但是当我读到你的问题时,你将要违反所有关于OO和多态的好处: - )。

下面我建议在Filter2上使用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();
    }
  }
}