为什么C#这样设计?
据我所知,接口只描述行为,并且用于描述实现某些行为的接口的类的合同义务.
如果类希望在共享方法中实现该行为,为什么不应该这样做呢?
这是我想到的一个例子:
// These items will be displayed in a list on the screen.
public interface IListItem {
string ScreenName();
...
}
public class Animal: IListItem {
// All animals will be called "Animal".
public static string ScreenName() {
return "Animal";
}
....
}
public class Person: IListItem {
private string name;
// All persons will be called by their individual names.
public string ScreenName() {
return name;
}
....
}
Run Code Online (Sandbox Code Playgroud) 我知道C#不支持静态方法继承.我还阅读了许多讨论(包括此处),其中开发人员声称需要此功能,典型的响应是"如果您需要静态成员继承,那么您的设计就存在缺陷".
好吧,鉴于OOP不希望我甚至考虑静态继承,我必须得出结论,我对它的明显需求指出了我的设计中的错误.但是,我被困住了.我真的很感激帮助解决这个问题.这是挑战......
我想创建一个抽象基类(我们称之为Fruit),它封装了一些复杂的初始化代码.此代码不能放在构造函数中,因为其中一些代码将依赖于虚方法调用.
Fruit将由其他具体类(Apple,Orange)继承,每个类必须公开标准工厂方法CreateInstance()以创建和初始化实例.
如果静态成员继承是可行的,我会将工厂方法放在基类中,并使用对派生类的虚方法调用来获取必须从中初始化具体实例的类型.客户端代码可以简单地调用Apple.CreateInstance()来获取完全初始化的Apple实例.
但显然这是不可能的,所以有人可以解释我的设计需要如何改变以适应相同的功能.
我最近遇到了一个问题,似乎我需要一个'静态抽象'方法.我知道为什么这是不可能的,但我怎样才能解决这个限制?
例如,我有一个抽象类,它有一个描述字符串.由于此字符串对于所有实例都是通用的,因此它被标记为static,但我想要求从此类派生的所有类都提供它们自己的Description属性,因此我将其标记为abstract:
abstract class AbstractBase
{
...
public static abstract string Description{get;}
...
}
Run Code Online (Sandbox Code Playgroud)
它当然不会编译.我想过使用接口但接口可能不包含静态方法签名.
我应该简单地使它成为非静态的,并且总是得到一个实例来获取特定于类的信息吗?
有任何想法吗?