好的,昨天我正在扫描一些代码,我看到了这个,
代码:
public class MyBaseClass
{
public string Field0()
{
return string.Empty;
}
}
public class MyClass : MyBaseClass
{
public string Field1()
{
return String.Empty;
}
}
非常简单没有抱怨。在主要代码中,
代码:
private void Form1_Load(object sender, EventArgs e)
{
}
private MyBaseClass GetSomthing()
{
var retVal = new MyClass();
return retVal;
}
现在这个代码编译正确,即使函数GetSomthing()的返回类型为MyBaseClass,它实际上允许返回MyClass(我假设这是因为继承)。
我在somone elses代码中发现了这一点,对我来说这看起来很糟糕,虽然我可能会遗漏某些东西,但是有人有任何想法吗?
答案 0 :(得分:7)
为什么练习不好?那绝对没问题。例如,您可能需要:
public IEnumerable<string> GetNames()
{
return new List<string> { "Fred", "Jon", "Joe" };
}
从封装的角度来看,它是完全合理的 - 你将接口与你愿意保证的调用者(它将是一系列字符串)从< em> implementation (你正在使用List<string>
)。这使您可以在不影响调用者的情况下更改实现。
这是良好的练习,而不是糟糕的练习。
答案 1 :(得分:2)
MyClass
的实例也是MyBaseClass
的一个实例,因此完全有效(并且常见)...