有一个接口OptionsSet
和一个抽象类StringBasedOptionsSet
。
interface OptionsSet {
string getString(string key);
int getInt(string key);
}
abstract class StringBasedOptionsSet : OptionsSet {
int getInt(string key) {
string v = getString(key);
try {
return Convert.ToInt32(v);
}
catch (Exception exc) {
if (exc is FormatException || exc is OverflowException) {
return 0;
}
throw;
}
}
}
为什么我无法从getString(string)
调用StringBasedOptionSet.getInt(string)
方法?
csmade/StringBasedOptionsSet.cs(21,36): error CS0103: The name `getString' does not exist in the current context
csmade/StringBasedOptionsSet.cs(32,25): error CS0103: The name `getString' does not exist in the current context
我还尝试调用OptionsSet.getString(key)
和base.getString(key)
,这导致非静态方法 / 对象不包含getString 错误的定义。< / p>
编辑:StringBasedOptionsSet
没有实现OptionsSet
接口是一个错误,同时剥离了示例。 在我的实际代码中实现了接口。
答案 0 :(得分:1)
您需要在抽象类定义中将方法作为abstract
存根或适当的方法(可选virtual
)提供:
public abstract string getString(string key);
或者:
public virtual string getString(string key)
{
return null;
}
如果您打算强制派生类型提供getString
,则需要abstract
方法。如果您不想强制它,但允许覆盖它,则需要默认的virtual
方法。
请注意,您的抽象类不需要直接实现接口,这可以在派生类中完成,只要方法定义正确,接口仍然会满足:
interface IFoo
{
string GetFoo();
}
abstract class FooBase
{
public virtual string GetFoo()
{
return "Adam";
}
}
class Foo : FooBase, IFoo
{
}
然而,你可能不想这样做,这种设计似乎有点荒谬。
此外,C#命名约定支持方法名称的标题大小写,因此GetInt
和GetString
。接口的命名约定是以I
为前缀:IOptionSet
。
答案 1 :(得分:1)
因为StringBasedOptionsSet没有实现接口,所以您的类应该是:
interface OptionsSet {
string getString(string key);
int getInt(string key);
}
abstract class StringBasedOptionsSet : OptionsSet {
int getInt(string key) {
string v = getString(key);
try {
return Convert.ToInt32(v);
}
catch (Exception exc) {
if (exc is FormatException || exc is OverflowException) {
return 0;
}
throw;
}
}
}
您可能还需要在抽象类中再次定义该函数。
答案 2 :(得分:0)
嗯,你的抽象类应该实现接口(因为它似乎是它的具体基础实现)并实现getString()作为Adam建议的抽象方法。
结果将是
abstract class StringBasedOptionsSet : OptionsSet
{
public abstract string getString(string key);
public int getInt(string key)
{
string v = getString(key);
try {
return Convert.ToInt32(v);
}
catch (Exception exc) {
if (exc is FormatException || exc is OverflowException) {
return 0;
}
throw;
}
}
}