在定义一个抽象的class时,是否可以强制子接口定义一个在父接口中定义的property/method?
When defining an abstract class, can you force a child to define a property/method defined in a parent interface?
考虑以下 class 定义。
public abstract class FooBase : IBar
{
public int Value {get; set;}
public string ToString()
{
//Return a string.
}
}
public interface IBar
{
int Value;
string ToString();
}
FooBase
是一个基础 class,它提供 IBar
接口的实现。
作为抽象class,FooBase
不能直接实例化。因此,另一个 class 必须派生自这个 class 才能有用。
现在,考虑这样一种情况,您需要像 FooBase
这样的对象来实现 IBar
接口,但是,对于一次特定成员 IBar
您需要 FooBase
来实现它,而不是 FooBase
本身。
有没有办法 implement/address 抽象 class 中的成员,例如 FooBase
,派生自 IBar
,这样 FooBase
必须实现 IBar
中的单个成员,而不是依赖 FooBase
?
的基本实现
我假设没有,因为编译器告诉我们不允许声明像 public abstract int Value
这样的值,但我认为这值得询问和验证。但是,也许我错了,如果是这样,是否有适当的方法来强制我的基础 class 的子实现从我的基础上的父接口实现一个成员?
assume there isn't because the compiler is telling that declaring a value like public abstract int Value is not allowed
当然是允许的,这编译得很好:
interface IBar
{
int Foo { get; set; }
string Blah();
}
abstract class Base: IBar
{
public abstract int Foo { get; set;}
public string Blah() => null;
}
现在:
class Derived: Base
{
//must implement Foo
}
顺便说一下,您的代码无法编译,您不能在接口中定义字段。
编译得很好:
public abstract class FooBase : IBar
{
public abstract int Value { get; set; }
}
public interface IBar
{
int Value { get; }
}
派生自 FooBase
的任何 class 必须覆盖值:
public class Concrete : FooBase
{
public override int Value { get; set; }
}
考虑以下 class 定义。
public abstract class FooBase : IBar
{
public int Value {get; set;}
public string ToString()
{
//Return a string.
}
}
public interface IBar
{
int Value;
string ToString();
}
FooBase
是一个基础 class,它提供 IBar
接口的实现。
作为抽象class,FooBase
不能直接实例化。因此,另一个 class 必须派生自这个 class 才能有用。
现在,考虑这样一种情况,您需要像 FooBase
这样的对象来实现 IBar
接口,但是,对于一次特定成员 IBar
您需要 FooBase
来实现它,而不是 FooBase
本身。
有没有办法 implement/address 抽象 class 中的成员,例如 FooBase
,派生自 IBar
,这样 FooBase
必须实现 IBar
中的单个成员,而不是依赖 FooBase
?
我假设没有,因为编译器告诉我们不允许声明像 public abstract int Value
这样的值,但我认为这值得询问和验证。但是,也许我错了,如果是这样,是否有适当的方法来强制我的基础 class 的子实现从我的基础上的父接口实现一个成员?
assume there isn't because the compiler is telling that declaring a value like public abstract int Value is not allowed
当然是允许的,这编译得很好:
interface IBar
{
int Foo { get; set; }
string Blah();
}
abstract class Base: IBar
{
public abstract int Foo { get; set;}
public string Blah() => null;
}
现在:
class Derived: Base
{
//must implement Foo
}
顺便说一下,您的代码无法编译,您不能在接口中定义字段。
编译得很好:
public abstract class FooBase : IBar
{
public abstract int Value { get; set; }
}
public interface IBar
{
int Value { get; }
}
派生自 FooBase
的任何 class 必须覆盖值:
public class Concrete : FooBase
{
public override int Value { get; set; }
}