用于创建可选属性的C#接口
我用C#编写了接口,并且它已经由类实现了。我是否可以在接口中添加一个或多个属性作为可选属性,而不修改现有的实现类 例如 在这本书中,芬德温道已经写好了。是否可以添加一个可选属性而不在现有类中实现 即用于创建可选属性的C#接口,c#,interface,C#,Interface,我用C#编写了接口,并且它已经由类实现了。我是否可以在接口中添加一个或多个属性作为可选属性,而不修改现有的实现类 例如 在这本书中,芬德温道已经写好了。是否可以添加一个可选属性而不在现有类中实现 即 您可以创建一个新界面,希望使用该选项的形状将从该界面派生: public interface IWindowedShape : IShape { string WindowName{get;} } 因此,如果向您传递了一个IShape,您现在可以尝试对iIndowedShape进行强制转换
您可以创建一个新界面,希望使用该选项的形状将从该界面派生:
public interface IWindowedShape : IShape
{
string WindowName{get;}
}
因此,如果向您传递了一个IShape
,您现在可以尝试对iIndowedShape
进行强制转换,以便能够访问此可选属性
public void DoStuff(IShape shape)
{
var windowed = shape as IWindowedShape;
string windowName = null;
if(windowed!=null)
{
windowName = windowed.WindowName;
}
}
没有接口可选成员的概念 这里需要定义两个接口。一个包含
区域
,另一个包含窗口名
。大概是这样的:
public interface IShape
{
int area { get; }
}
public interface IFindWindow: IShape
{
string WindowName { get; }
}
然后实现类可以选择实现IShape
或IFindWindow
在运行时,您只需使用is
操作符来确定手头的对象是否实现了IFindWindow
IShape shape = ...;
if (shape is IFindWindow)
....
要实际使用更派生的接口,请使用as
运算符:
IShape shape = ...;
IFindWindow findWindow = shape as IFindWindow;
if (findWindow != null)
string windowName = findWindow.WindowName;
不,这是不可能的。若从接口派生,则必须在派生类中定义其所有成员 要实现您想要的,您可以考虑使用
抽象类
用例示例:
public abstract class Base {
public abstract Name {get;set;} // MUST DEFINE IN DERIVED CLASS, LIKE INTERFACE
public string Surname {get;set;} // JUST A SIMPLE PROPERTY OF A BASE CLASS
}
另一方面,若您需要目标分离,请定义多个具有不同属性的接口
,并在需要时从适当的接口派生 接口的本质是您必须实现所有提供的方法和/或属性
在您的情况下,您可以创建新的第二个接口,该接口继承自原始接口:
public interface IShape
{
int area { get; }
}
public interface IShapeEx : IShape
{
string WindowName { get; }
}
您的新类将实现ishapex
,而您的“遗留类”仍将实现IShape
如果它是可选的,那么它是无用的。不,你不能这样做。@sNotALie。我不同意这种说法(当然我可能是错的)。在这样的情况下,您已经有了一个在大量类中实现的接口,并且您需要一些道具来传递,这仅仅是因为两个新类有了新的行为,将其添加到每个类中可能会很乏味,因为您需要因为这1个或2个类而注入1个道具。如果它只是一个空道具,只被那些类使用,而没有任何机会出现更多具有这种行为的类,那么它肯定是无用的。拥有默认的实现道具或somth会很酷。@MantasDaškevičius如果你想要默认的impls,请查看摘要。否则,为什么不制作一个子接口呢?@It'sNotALie。我只是想表达我的观点。TBH,是的,我会在那个类上再创建并实现一个接口,然后检查已解析的类是否实现了它。从某种意义上说。。。是 啊一方面,它有点超出了接口的用途
public abstract class Base {
public abstract Name {get;set;} // MUST DEFINE IN DERIVED CLASS, LIKE INTERFACE
public string Surname {get;set;} // JUST A SIMPLE PROPERTY OF A BASE CLASS
}
public interface IShape
{
int area { get; }
}
public interface IShapeEx : IShape
{
string WindowName { get; }
}