鉴于样本是我挣扎的示范。我需要统一FillBaseClass
和FillBaseClass
方法(DRY)并且不知道如何。我有什么选择?它有可能吗?
public class BaseClass
{
public BaseClass(int a, int b)
{
A = a;
B = b;
}
public void DoSomeCalculation()
{
C = A - B;
}
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
public class DerivedClass : BaseClass
{
public DerivedClass(int a, int b, int propertyOdDerivedClass) : base(a, b)
{
PropertyOfDerivedClass = propertyOdDerivedClass;
}
public int PropertyOfDerivedClass { get; set; }
}
public class OtherClass
{
public void FillBaseClass(List<StorageFile> files, List<BaseClass> listToFill)
{
foreach (var file in files)
{
var item = new BaseClass(file.Name.Count(), file.Path.Count());// just sample..
item.DoSomeCalculation();
listToFill.Add(item);
}
}
//Join these 2 methods together?
public void FillDerivedClass(List<StorageFile> files, List<DerivedClass> listToFill, int someOtherInt)
{
foreach (var file in files)
{
var item = new DerivedClass(file.Name.Count(), file.Path.Count(),someOtherInt);// just sample..
item.DoSomeCalculation();
listToFill.Add(item);
}
}
}
答案 0 :(得分:1)
您将让消费者接受任何基类或基类子实体。请注意,如果你有2个这样的实体,比如问题中的实体,你需要两个OtherClass实例,一个具有基类提供者,另一个作为派生类。
下面的伪代码: -
public class ClassHandler<T> where T : BaseClass, new()
{
public void FillEntity(List<StorageFile> files, List<T> listToFill)
{
T obj = null;
files.ForEach(file =>
{
switch (typeof(T).Name)
{
case "BaseClass":
obj = new BaseClass(file.BaseProp) as T;
listToFill.Add(obj);
break;
case "DerievedClass":
obj = new DerievedClass(file.BaseProp, file.DerievedProp) as T;
listToFill.Add(obj);
break;
};
});
}
}
消费者代码
var base = new OtherClass<BaseClass>();
var derieved = new OtherClass<DerievedClass>();
List<StorageFile> files = GetFilesFromSomewhere();
List<DerievedClass> derievedClasses = new ...
List<BaseClass> baseClasses = new ...
var listOfDerieved = base.FillEntity(files, derievedClasses);
var listOfBase = derieved.FillEntity(files,baseClasses );
答案 1 :(得分:1)
为什么不将第三个参数设为public void FillClass(List<StorageFile> files, List<BaseClass> listToFill, int? someOtherInt = null)
{
BaseClass item;
foreach (var file in files)
{
if (someOtherInt.HasValue)
item = new DerivedClass(file.Name.Count(), file.Path.Count(),someOtherInt.Value);
else
item = new BaseClass(file.Name.Count(), file.Path.Count());
item.DoSomeCalculation();
listToFill.Add(item);
}
}
并根据其值创建正确的实例?
所以我会简单地做下面的事情:
null
请注意,第三个参数的默认值为FillClass
,因此您可以在不提供的情况下致电bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
recvfrom(RecvSocket,RecvBuf, 5, 0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);
...
int i=sendto(RecvSocket,SendBuf,strlen(SendBuf)+1,0,(SOCKADDR *) &RecvAddr,sizeof(RecvAddr));
。