是否可以在以下示例中覆盖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类中的关键字。
所以,这是最终期望
是否可以使用OOPS语言?
答案 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();
}
}
}