C# 抽象类、接口、容器和方法的问题
我有下面的场景 我有一个接口C# 抽象类、接口、容器和方法的问题,c#,interface,ioc-container,abstract-class,C#,Interface,Ioc Container,Abstract Class,我有下面的场景 我有一个接口 public interface ImyInterface { void myInterfaceMethod(string param); } 我有一个抽象类 public abstract class myAbstractClass { public myAbstractClass() { //something valid for each inherited class } public void my
public interface ImyInterface
{
void myInterfaceMethod(string param);
}
我有一个抽象类
public abstract class myAbstractClass
{
public myAbstractClass()
{
//something valid for each inherited class
}
public void myAbstractMethod<T>(T param)
{
//something with T param
}
}
最后,我有一个类,我将在其中创建一个ImyInterface对象。此时我将调用myAbstractMethod,但是
public class myFinalClass
{
public void myFinalMethod()
{
ImyInterface myObj = _myContainer<ImyInterface>();
myObj.???
}
}
公共类myFinalClass
{
公共无效myFinalMethod()
{
ImyInterface myObj=_myContainer();
myObj。???
}
}
显然没有这个方法,因为它没有声明到接口中。
我的解决方案如下
public interface ImyInterface
{
void myInterfaceMethod(string param);
void myFakeMethod<T>(T param);
}
public class myClass : myAbstractClass, ImyInterface
{
public myClass():base()
{}
public void ThisMethodWillNeverCall()
{
// nothing to do
}
//--- a fake method
public void myFakeMethod<T>(T param)
{
base.myAbstractMethod<T>(param);
}
}
公共接口ImyInterface
{
void myInterfaceMethod(字符串参数);
void-myFakeMethod(T参数);
}
公共类myClass:myAbstractClass,ImyInterface
{
public myClass():base()
{}
public void this methodwillnevercall()
{
//无事可做
}
//---假方法
公共无效myFakeMethod(T参数)
{
base.myAbstractMethod(param);
}
}
还有比我的更好的解决办法吗
谢谢大家! 首先,您的命名约定很混乱。仔细阅读微软所做的努力 根据你的例子也很难说出你想要实现什么 回到你的问题: 您应该仅访问一个接口才能使用该接口。不要试图用类/接口制作任何神奇的东西来让它们协同工作。这通常意味着类不应该尝试实现接口
最好创建一个新接口,该接口具有您想要的特性,并让您的类实现这两个特性。首先,您的命名约定很混乱。仔细阅读微软所做的努力 根据你的例子也很难说出你想要实现什么 回到你的问题: 您应该仅访问一个接口才能使用该接口。不要试图用类/接口制作任何神奇的东西来让它们协同工作。这通常意味着类不应该尝试实现接口
最好创建一个新接口,该接口具有您想要的功能,并让您的类实现这两个功能。为什么您认为这是一个问题?如果使用接口的代码需要该方法,则该方法应该是接口的一部分。如果您正在使用接口,则显然需要在接口上声明这些方法。放弃接口,使用抽象类。请注意,
void myAbstractMethod()
不是抽象的。这会分散读者的注意力,使读者感到困惑。杰森:这不是一个真正的问题,但也许有比我更好的解决方案吗?为什么你认为这是一个问题?如果使用接口的代码需要该方法,则该方法应该是接口的一部分。如果您正在使用接口,则显然需要在接口上声明这些方法。放弃接口,使用抽象类。请注意,void myAbstractMethod()
不是抽象的。这会分散读者的注意力,使读者感到困惑。杰森:这不是一个真正的问题,但也许有比我更好的解决方案。这是一个例子,我试着写得尽可能简单。谢谢你,我会按照你的建议创建一个新的界面。这是一个例子,我试着写得尽可能简单。谢谢,我将按照您的建议创建一个新界面。
public interface ImyInterface
{
void myInterfaceMethod(string param);
void myFakeMethod<T>(T param);
}
public class myClass : myAbstractClass, ImyInterface
{
public myClass():base()
{}
public void ThisMethodWillNeverCall()
{
// nothing to do
}
//--- a fake method
public void myFakeMethod<T>(T param)
{
base.myAbstractMethod<T>(param);
}
}