两个具有相似属性的不同类的一个函数



嗨,继承失败后(它变得复杂),我偶然发现了泛型。我是一个编程新手,c#是我的第一门语言。

我有两个类CIMTDXInput, RMTTDXInput,它们具有相同的属性,但这些属性有稍微不同的成员。对于两者之间相同的3个属性,我只想检查它们是否为空。

所以我这样写:

public static TDX2KlarfResult CheckCIMTDXInput <T> (T input, TDX2KlarfResult result) where T: CIMTDXInput, RMTTDXInput
{

if (input.ToolContext == null)
{
Logger.Warn("Missing Tool Context Skipping the file");
result.errorType = "Warning";
result.errorMessage = "Missing Tool Context";
result.errorSubject = ErrorCategory.MISSING_TOOL_CONTEXT;
result.success = false;
return result;
}
if (input.SCContext == null)
{
Logger.Warn("Missing Context Skipping the file");
result.errorType = "Warning";
result.errorMessage = "Missing Context";
result.errorSubject = ErrorCategory.MISSING_CONTEXT;
result.success = false;
return result;
}
if (input.WaferContainer == null)
{
Logger.Warn("Missing Wafer Container Skipping the file");
result.errorType = "Warning";
result.errorMessage = "Missing Wafer Container";
result.errorSubject = ErrorCategory.MISSING_WAFER_CONTAINER;
result.success = false;
return result;
}
return result;
}

但是代码无法编译。我以为你可以分配多少门课给"t"?

这两个类都有ToolContext, SCContext和WaferContainer。与其为每一个都写一个函数,我认为为两个都写一个函数会更优雅。将来我还需要添加额外的输入,所以我不想每次都编写这个函数

原因

所以当你说:

public void MyMethod<T>(T value) where T: ClassA, ClassB

你说T应该同时由ClassAClassB导出。现在它将在这个场景中工作:

public class ClassA
{
public int SomeProperty { get; set; }
}
public class ClassB : ClassA
{
}
public class ClassC : ClassB
{
}
MyMethod<ClassB>(classBValue); // ClassB is a ClassB and is derived from ClassA
MyMethod<ClassC>(classCValue); // ClassC is derived from ClassB, and is indirectly derived from ClassA

但是这行不通:

public class ClassA
{
public int SomeProperty { get; set; }
}
public class ClassB
{
public int SomeProperty { get; set; }
}

因为它需要一个像这样的ClassC:

public class ClassC : ClassA, ClassB
{
}
这可能会导致编译时错误,因为c#不支持多重继承。也就是说,虽然你可以从另一个类派生出来的类派生出一个类,但你不能创建一个直接从两个类派生出来的类。 <标题>

的解决方案你能做的就是声明一个接口:

public interface ISomeInterface
{
int SomeProperty { get; set; }
}

并让两个类都实现它:

public class ClassA : ISomeInterface
{
public int SomeProperty { get; set; }
}
public class ClassB : ISomeInterface
{
public int SomeProperty { get; set; }
}

如果我们改变方法签名,要求类实现我们的接口:

public void MyMethod<T>(T value) where T: ISomeInterface

然后在方法中我们可以访问TSomeProperty属性:

public void MyMethod<T>(T value) where T: ISomeInterface
{
value.SomeProperty *= 2;
}

上网试试

你需要使用一个接口

public interface IInput
{
public string ToolContext {get;set;}
public string SCContext {get;set;}
public string WaferContainer {get;set;}

}
public class CIMTDXInput:IInput
{
public string ToolContext {get;set;}
public string SCContext {get;set;}
public string WaferContainer {get;set;}
.... another properties
}

public class RMTTDXInput:IInput
{
public string ToolContext {get;set;}
public string SCContext {get;set;}
public string WaferContainer {get;set;}
.... another properties
}

,你的方法应该是

public static TDX2KlarfResult CheckCIMTDXInput<T>(T input, TDX2KlarfResult result) where T : IInput

或者你可以不使用泛型在这种情况下,就足够了

public static TDX2KlarfResult CheckCIMTDXInput(IInput input, TDX2KlarfResult result)

相关内容

最新更新